2016-11-23 2 views
0

У меня есть объект JSON в следующем формате:Ошибки синтаксического анализа JSON на Android (Java)

{ 
"_id": "1", 
"trips": [{ 
    "origin": "Spain", 
    "destination": "France" 
}, { 
    "origin": "Italy", 
    "destination": "Germany" 
}, { 
    "origin": "Portugal", 
    "destination": "Ireland" 
}] 
} 

Моя цель состоит в том, чтобы разобрать этот JSON и получить ArrayList поездки, для которого у меня есть следующий код:

class Trip { 
    String origin; 
    String destination; 
} 

ArrayList<Trip> tripList; 

public ArrayList<Trip> getTripList(String json){ 

    Trip thisTrip = new Trip(); 
    ArrayList<Trip> thisTripList = new ArrayList<Trip>(); 

    try { 
     JSONObject jsonObject = new JSONObject(json); 
     JSONArray tripArray = jsonObject.getJSONArray("trips"); 

     for(int i = 0; i < tripArray.length(); i++){ 
      JSONObject tripInstance = tripArray.getJSONObject(i); 

      thisTrip.origin = tripInstance.getString("origin"); 
      thisTrip.destination = tripInstance.getString("destination"); 

      thisTripList.add(thisTrip); 
     } 

     return(thisTripList); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
     return(null); 
    } 
} 

Однако, когда я исполняю этот метод, как показано ниже, я получаю ArrayList размера 3, который является правильным, но имеет все значения происхождения/назначения идентичных (т.е. Португалия, Португалия, Португалия, Ирландия, Ирландия, Ирландия). Что я делаю не так?

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
//... 
     Trip trip = new Trip(); 
     tripList = new ArrayList<Trip>(); 
     tripList = getTripList(json); 
//... 
+0

Совет для будущего. Лучше использовать класс модели с геттерами и сеттерами –

ответ

3

Попробуйте это.

public ArrayList<Trip> getTripList(String json){ 
    Trip thisTrip; 
    ArrayList<Trip> thisTripList = new ArrayList<Trip>(); 

    try { 
     JSONObject jsonObject = new JSONObject(json); 
     JSONArray tripArray = jsonObject.getJSONArray("trips"); 

     for(int i = 0; i < tripArray.length(); i++){ 
      JSONObject tripInstance = tripArray.getJSONObject(i); 
      thisTrip = new Trip(); 
      thisTrip.origin = tripInstance.getString("origin"); 
      thisTrip.destination = tripInstance.getString("destination"); 

      thisTripList.add(thisTrip); 
     } 

     return(thisTripList); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
     return(null); 
    } 
} 
+0

Спасибо, суреш, это решило мою проблему! :) – Victor

2

Здесь вы создаете thisTrip = new Trip(); за 1 раз и повторно использовать его в течение цикла, поэтому значения отражают на объекте, так и в массиве вы храните он также имеет тот же объект несколько раз, так что вы получаете то же самое значение из массива.

Таким образом, создайте thisTrip = new Trip(); с петлей. что решит вашу проблему.

Пример:

for(int i = 0; i < tripArray.length(); i++){ 
      JSONObject tripInstance = tripArray.getJSONObject(i); 

      Trip thisTrip = new Trip(); 

      thisTrip.origin = tripInstance.getString("origin"); 
      thisTrip.destination = tripInstance.getString("destination"); 

      thisTripList.add(thisTrip); 
     } 
0

Попробуйте этот простой код

class Trip { 
    String origin; 
    String destination; 

public Trip(String origin,String destination){ 
     this.origin = origin; 
     this.destination = destination; 
} 

    //getter and setter method here 
} 

ArrayList<Trip> tripList; 

public ArrayList<Trip> getTripList(String json){ 


    tripList = new ArrayList<>(); 

    try { 
     JSONObject jsonObject = new JSONObject(json); 
     JSONArray tripArray = jsonObject.getJSONArray("trips"); 

     for(int i = 0; i < tripArray.length(); i++){ 
      JSONObject tripInstance = tripArray.getJSONObject(i); 
      tripList.add(new Trip(tripInstance.getString("origin"),tripInstance.getString("destination"))); 

     } 

     return tripList; 

    } catch (JSONException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

В вашем OnCreate метод

ArrayList<Trip> tripList; 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tripList = getTripList(json); 
} 
6

Вы используете один и тот же объект поездки в каждом цикле. Таким образом, один и тот же объект ссылается 3 раза в arrayList. Вот почему данные одинаковы для всех трех объектов. Пожалуйста, попробуйте ниже код: -

Trip.java

public class Trip { 

    String origin; 
    String destination; 

    public String getOrigin() { 
     return origin; 
    } 

    public void setOrigin(String origin) { 
     this.origin = origin; 
    } 

    public String getDestination() { 
     return destination; 
    } 

    public void setDestination(String destination) { 
     this.destination = destination; 
    } 
} 

В вашей деятельности

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_demo); 

    ArrayList<Trip> tripList = new ArrayList<Trip>(); 
    tripList = getTripList(json); 

    Log.e("Trips", "" + tripList.size()); 

} 

public ArrayList<Trip> getTripList(String json) { 

    ArrayList<Trip> thisTripList = new ArrayList<Trip>(); 

    try { 
     JSONObject jsonObject = new JSONObject(json); 
     JSONArray tripArray = jsonObject.getJSONArray("trips"); 

     for (int i = 0; i < tripArray.length(); i++) { 

      Trip trip = new Trip(); 
      trip.setOrigin(tripArray.getJSONObject(i).getString("origin")); 
      trip.setDestination(tripArray.getJSONObject(i).getString("destination")); 

      thisTripList.add(trip); 
     } 

     return (thisTripList); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
     return (null); 
    } 
} 
+0

Спасибо за ваш ответ, я новичок, но ваш код выглядит довольно приятным :) – Victor

+0

удовольствие помочь вам :) –

0

Проблема заключается в том, что вы используете один и тот же объект поездки каждый итерации цикла. Тот же объект Trip ссылается 3 раза в вашем списке. Вот почему источник и место назначения одинаковы для всех трех объектов.

Попробуйте создать новый объект Trip вместо каждой итерации цикла. Таким образом, каждый объект в списке является другим объектом.

Смежные вопросы