我已经想要阅读我的JSONData了,现在我想将“name”键显示在一个组合框中。 但我得到了我的字符串数组的nullpointerexception。 在我尝试将JSON对象直接发送到defaultComboBoxModel之前。但它需要是和String Array所以当我转换它时,一切都变为null。 为什么我的数组变为空?
我的代码:
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 :(得分: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
实际返回一个列表,您将该列表分配给array.get(i)
,然后将该数组添加到该列表中,这将导致循环引用(myList
包含包含{array
的列表1}}等。)。
接下来,您在每次迭代中替换array
,这可能不是您想要的。
假设myList
包含array
个问题,JSONArray
扩展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()]);
}
的{{1}}的{{1}}列表转换为字符串的平面列表,并将其作为一个数组。