0

我已经阅读了我的 JSONData,现在我想将“名称”键显示到组合框中。但是我得到了我的字符串数组的空指针异常。在我尝试将 JSON 对象直接发送到 defaultComboBoxModel 之前。但它必须是字符串数组,所以当我转换它时,一切都变成了空值。为什么我的数组为空?

我的代码:

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); 
4

1 回答 1

0

我不会评论代码风格或设计缺陷,但这里有一些看起来像错误的行:

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

myList是一个ArrayList,虽然我不知道arrayJSONArray实际上包含什么,但如果它包含字符串或JSONObject实例,则转换array.get(i)ArrayList可能会导致ClassCastException. 如果array包含其他JSONArrays,它可能不会发生。

下一行也很奇怪。假设array.get(i)实际返回一个列表,您将该列表添加到该列表中myList,然后将该数组添加到该列表中,这将导致循环引用(array包含包含array等的列表)。

接下来,您将myList在每次迭代中进行替换,这可能不是您想要的。

假设array包含JSONArrayistances、JSONArrayextends 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包含JSONArrays 且包含Strings)转换为平面字符串列表并将其作为数组返回。

于 2013-03-26T13:08:07.920 回答