2013-03-26 4 views
0

Мне удалось прочитать мою JSONData, и теперь я хочу отобразить ключ «name» в combobox. Но я получаю nullpointerexception моего массива строк. Прежде чем я попытался отправить объект JSON прямо в defaultComboBoxModel. Но это должно быть и String Array, поэтому, когда я его преобразовал, все стало нулевым. Почему мой массив получает нуль?Как отображать данные JSON в comboBox?

Мой код:

import java.util.ArrayList; 
import org.json.simple.JSONArray; 
import org.json.simple.JSONObject; 


public class Planner { 

    private String startingLocation; 
    private String destination; 
    private static Planner planner = null; 
    private int id; 
    private JSONArray array; 
    ArrayList myList = new ArrayList(); 

    public static Planner getPlanner(){ 

     if (planner == null){ 

      planner = new Planner(); 

     } 

     return planner; 

    } 

    public void setStartingLocation(String from) { 

     this.startingLocation = from;  

    } 

    public void setDestination(String dest) { 

     this.destination = dest; 

    } 

    public String getStartingLocation() { 

     return startingLocation; 

    } 

    public String getDestination() { 

     return destination; 

    } 


    public void setID(int id) { 

     this.id = id; 

    } 

    public void setLocationName (JSONArray array){ 

     this.array = (JSONArray) array; 

    } 

    public String[] getLocationName(){ 

     System.out.println(this.array.size()); 

     for (int i=0; i<this.array.size(); i++){ 

      myList = (ArrayList) this.array.get(i); 
      myList.add(i, array); 

     } 

     System.out.println(myList); 

    return (String[]) myList.toArray(); 

    } 

} 

public void parseJsonData() throws ParseException { 

     JSONParser parser = new JSONParser(); 
     Object obj = parser.parse(jsonData); 
     JSONObject topObject = (JSONObject) obj; 
     JSONObject locationList = (JSONObject) topObject.get("LocationList"); 
     JSONArray array = (JSONArray) locationList.get("StopLocation"); 
     Iterator<JSONObject> iterator = array.iterator(); 
     String name = null; 

     while (iterator.hasNext()) { 

      JSONObject jsonObj = (JSONObject) iterator.next(); 
      Planner.getPlanner().setLocationName(array); 

     } 

    } 

final DefaultComboBoxModel model = new DefaultComboBoxModel(Planner.getPlanner().getLocationName()); 
     comboBox = new JComboBox(model); 
+0

Где находится NPE? Вы отлаживали свой код? – Thomas

+0

Он даже не работает, чтобы отлаживать графические файлы, прежде чем он даже откроется, но это было не так. – Josef

+0

final DefaultComboBoxModel model = new DefaultComboBoxModel (Planner.getPlanner(). GetLocationName()); comboBox = новый JComboBox (модель); Он никогда не отправляет модель в поле со списком, но перескакивает через нее и исключает исключение, и приложение даже не запускается. – Josef

ответ

0

Я не буду комментировать код стиля или конструктивных недостатков, но вот некоторые строки, которые выглядят как ошибка:

for (int i=0; i<this.array.size(); i++){ 
     myList = (ArrayList) this.array.get(i); 
     myList.add(i, array); 
} 

myList является ArrayList и хотя я не знаю, что array, которое является JSONArray, действительно содержит, но если оно содержит либо строки, либо JSONObject экземпляров, отличных от array.get(i) до ArrayList, вероятно, приведет к ClassCastException. Если array содержит другие JSONArray, возможно, это не произойдет.

Следующая строка довольно странная задница. Предполагая, что действительно возвращает список, вы оцениваете этот список до myList, а затем добавьте массив в этот список, что приведет к циклической ссылке (array содержит список, содержащий array и т. Д.).

Затем вы заменяете myList на каждой итерации, которая может быть не такой, какой вы хотите.

Предполагая, что array содержит JSONArray istances, JSONArray расширяет ArrayList (отсюда нет ClassCastException), а внутренний массив содержит строки, вы можете изменить способ что-то вроде этого:

public String[] getLocationName(){ 

    System.out.println(this.array.size()); 

    List<String> resultList = new LinkedList<String>();   

    for (int i=0; i<this.array.size(); i++){ 
     //cast the inner array to a list of Strings (assuming it only contains Strings) 
     List<String> innerList = (ArrayList) this.array.get(i); 

     //add the inner list to the result list 
     resultList.addAll(innerList); 

    } 

    System.out.println(resultList); 

    return resultList.toArray(new String[resultList.size()]); 
} 

Таким образом, вы бы преобразовать список списков строк (то есть JSONArray, содержащий JSONArray s, которые содержат String s), в плоский список строк и возвращать их как массив.

+0

Это не работает stil nullpointer в том же месте – Josef

+0

массив - это JSONArray с JSONObjects – Josef

+0

Пожалуйста, укажите точную строку (отметьте ее, не просто укажите номер строки!), Где происходит NPE. Кроме того, если массив содержит JSONObjects, то вы _must not_ передаете 'ArrayList'. Кроме того, вам нужно будет извлечь свойство location из текущего элемента. – Thomas

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