我有一个json流,可以是:
{"intervention":
{
"id":"3",
"subject":"dddd",
"details":"dddd",
"beginDate":"2012-03-08T00:00:00+01:00",
"endDate":"2012-03-18T00:00:00+01:00",
"campus":
{
"id":"2",
"name":"paris"
}
}
}
或类似
{"intervention":
[{
"id":"1",
"subject":"android",
"details":"test",
"beginDate":"2012-03-26T00:00:00+02:00",
"endDate":"2012-04-09T00:00:00+02:00",
"campus":{
"id":"1",
"name":"lille"
}
},
{
"id":"2",
"subject":"lozlzozlo",
"details":"xxx",
"beginDate":"2012-03-14T00:00:00+01:00",
"endDate":"2012-03-18T00:00:00+01:00",
"campus":{
"id":"1",
"name":"lille"
}
}]
}
在我的Java代码中,我执行以下操作:
JSONObject json = RestManager.getJSONfromURL(myuri); // retrieve the entire json stream
JSONArray interventionJsonArray = json.getJSONArray("intervention");
在第一种情况下,上述方法不起作用,因为流中只有一个元素。
如何检查流是object
还是array
?
我尝试使用json.length()
,但它没有用。
由于
答案 0 :(得分:112)
这样的事情应该这样做:
JSONObject json;
Object intervention;
JSONArray interventionJsonArray;
JSONObject interventionObject;
json = RestManager.getJSONfromURL(myuri); // retrieve the entire json stream
Object intervention = json.get("intervention");
if (intervention instanceof JSONArray) {
// It's an array
interventionJsonArray = (JSONArray)intervention;
}
else if (intervention instanceof JSONObject) {
// It's an object
interventionObject = (JSONObject)intervention;
}
else {
// It's something else, like a string or number
}
这样做的好处是只需从主JSONObject
获取属性值一次。由于获取属性值涉及遍历哈希树或类似物,这对于性能(对于它的价值)是有用的。
答案 1 :(得分:13)
也许像这样的支票?
JSONObject intervention = json.optJSONObject("intervention");
如果干预对象不是JSON对象,则返回JSONObject
或null
。接下来,执行此操作:
JSONArray interventions;
if(intervention == null)
interventions=jsonObject.optJSONArray("intervention");
如果数组是有效的JSONArray
,则会返回一个数组,否则会返回null
。
答案 2 :(得分:9)
为简单起见,您只需从服务器结果中检查第一个字符串即可。
String result = EntityUtils.toString(httpResponse.getEntity()); //this function produce JSON
String firstChar = String.valueOf(result.charAt(0));
if (firstChar.equalsIgnoreCase("[")) {
//json array
}else{
//json object
}
这个技巧仅基于JSON格式的字符串{foo : "bar"}
(对象)
或[ {foo : "bar"}, {foo: "bar2"} ]
(数组)
答案 3 :(得分:2)
Object valueObj = uiJSON.get(keyValue);
if (valueObj instanceof JSONObject) {
this.parseJSON((JSONObject) valueObj);
} else if (valueObj instanceof JSONArray) {
this.parseJSONArray((JSONArray) valueObj);
} else if(keyValue.equalsIgnoreCase("type")) {
this.addFlagKey((String) valueObj);
}
// ITETER JSONARRAY 私人void parseJSONArray(JSONArray jsonArray)抛出JSONException { for(迭代器iterator = jsonArray.iterator(); iterator.hasNext();){ JSONObject对象=(JSONObject)iterator.next(); this.parseJSON(object); } }
答案 4 :(得分:0)
我没有尝试过,但也许......
JsonObject jRoot = RestManager.getJSONfromURL(myuri); // retrieve the entire json stream
JsonElement interventionElement = jRoot.get("intervention");
JsonArray interventionList = new JsonArray();
if(interventionElement.isJsonArray()) interventionList.addAll(interventionElement.getAsJsonArray());
else interventionList.add(interventionElement);
如果它是JsonArray对象,只需使用getAsJsonArray()来强制转换它。如果没有,它只是一个元素,所以只需添加它。
无论如何,你的第一个例子坏了,你应该要求服务器的所有者修复它。 JSON数据结构必须一致。这不仅仅是因为有时干预只有一个元素,它不需要是一个数组。如果它只有1个元素,它将只是一个元素的数组,但仍然必须是一个数组,以便客户端可以使用始终相同的模式解析它。
答案 5 :(得分:0)
//returns boolean as true if it is JSONObject else returns boolean false
public static boolean returnBooleanBasedOnJsonObject(Object jsonVal){
boolean h = false;
try {
JSONObject j1=(JSONObject)jsonVal;
h=true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(e.toString().contains("org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject")){
h=false;
}
}
return h;
}
答案 6 :(得分:0)
您可以使用以下代码获取输入字符串的对象。
String data = "{ ... }";
Object json = new JSONTokener(data).nextValue();
if (json instanceof JSONObject)
//do something for JSONObject
else if (json instanceof JSONArray)
//do something for JSONArray
链接:https://developer.android.com/reference/org/json/JSONTokener#nextValue