我正在尝试解析一些JSON,但我遇到了一些麻烦。
这是我已经尝试过的:
ContentValues categories = new ContentValues();
JSONObject json = new JSONObject(improvedInputStreamAsString);
Iterator keys = json.keys();
while(keys.hasNext()) {
Object newObj = keys.next();
String jsonString = newObj.toString();
if(jsonString == "children") {
JSONObject newJsn = new JSONObject(jsonString);
if(newJsn.has("name")) {
String category = newJsn.getString("name");
categories.put("categories", category);
}
}
}
我只是尝试从JSONObject
获取该类别,但由于某种原因jsonString
从未评估为children
。
这是结构,对不起,我粘贴了这么大的一部分,我发现JSON真的很混乱,很难尝试在保留其完整性的同时将其删除,请记住我只是想获得name
字段:
{
"position": "0",
"children": [
{
"position": "1",
"children": [
{
"position": "1",
"children": [
{
"position": "3",
"children": [
],
"category_id": "9",
"level": "3",
"is_active": "1",
"name": "Exfoliants",
"parent_id": "4"
},
{
"position": "4",
"children": [
],
"category_id": "10",
"level": "3",
"is_active": "1",
"name": "Moisturisers",
"parent_id": "4"
},
{
"position": "5",
"children": [
],
"category_id": "11",
"level": "3",
"is_active": "1",
"name": "Treatments",
"parent_id": "4"
},
{
"position": "6",
"children": [
],
"category_id": "12",
"level": "3",
"is_active": "1",
"name": "Cleansers",
"parent_id": "4"
},
{
"position": "7",
"children": [
],
"category_id": "13",
"level": "3",
"is_active": "1",
"name": "Skin Toners",
"parent_id": "4"
},
{
"position": "9",
"children": [
],
"category_id": "15",
"level": "3",
"is_active": "1",
"name": "Serums",
"parent_id": "4"
},
{
"position": "10",
"children": [
],
"category_id": "36",
"level": "3",
"is_active": "1",
"name": "Acne and Blemish Treatments",
"parent_id": "4"
},
{
"position": "11",
"children": [
],
"category_id": "40",
"level": "3",
"is_active": "1",
"name": "Oils",
"parent_id": "4"
}
],
"category_id": "4",
"level": "2",
"is_active": "1",
"name": "Skincare",
"parent_id": "2"
},
{
"position": "2",
"children": [
{
"position": "1",
"children": [
],
"category_id": "16",
"level": "3",
"is_active": "1",
"name": "Sunscreen",
"parent_id": "5"
},
{
"position": "2",
"children": [
],
"category_id": "31",
"level": "3",
"is_active": "1",
"name": "Insect Repellent & After Bite",
"parent_id": "5"
},
{
"position": "3",
"children": [
],
"category_id": "32",
"level": "3",
"is_active": "1",
"name": "After Sun Lotions",
"parent_id": "5"
},
{
"position": "4",
"children": [
],
"category_id": "33",
"level": "3",
"is_active": "1",
"name": "Self Tanning Lotions",
"parent_id": "5"
}
],
"category_id": "5",
"level": "2",
"is_active": "1",
"name": "Suncare",
"parent_id": "2"
},
{
"position": "3",
"children": [
{
"position": "1",
"children": [
],
"category_id": "17",
"level": "3",
"is_active": "1",
"name": "Shampoo",
"parent_id": "6"
},
{
"position": "2",
"children": [
],
"category_id": "18",
"level": "3",
"is_active": "1",
"name": "Conditioner",
"parent_id": "6"
},
{
"position": "3",
"children": [
],
"category_id": "19",
"level": "3",
"is_active": "1",
"name": "Treatments",
"parent_id": "6"
},
{
"position": "4",
"children": [
],
"category_id": "20",
"level": "3",
"is_active": "1",
"name": "Toner",
"parent_id": "6"
},
{
"position": "6",
"children": [
],
"category_id": "34",
"level": "3",
"is_active": "1",
"name": "Styling",
"parent_id": "6"
},
{
"position": "7",
"children": [
],
"category_id": "39",
"level": "3",
"is_active": "1",
"name": "Serum",
"parent_id": "6"
}
],
"category_id": "6",
"level": "2",
"is_active": "1",
"name": "Hair",
"parent_id": "2"
},
{
"position": "0",
"children": [
{
"position": "1",
"children": [
{
"position": "1",
"children": [
{
"position": "3",
"children": [
],
"category_id": "9",
"level": "3",
"is_active": "1",
"name": "Exfoliants",
"parent_id": "4"
},
{
"position": "6",
"children": [
],
"category_id": "12",
"level": "3",
"is_active": "1",
"name": "Cleansers",
"parent_id": "4"
},
],
"category_id": "4",
"level": "2",
"is_active": "1",
"name": "Skincare",
"parent_id": "2"
},
{
"position": "2",
"children": [
{
"position": "1",
"children": [
],
"category_id": "16",
"level": "3",
"is_active": "1",
"name": "Sunscreen",
"parent_id": "5"
},
答案 0 :(得分:12)
您需要使用String.equals()来比较字符串:
if(jsonString.equals("children")) { ... }
jsonString ==“children”比较对象引用,而不是字符串。
答案 1 :(得分:3)
子级 是一个包含JSON数组的JSON对象。
您可以通过以这种方式调用从JSON对象中提取 children :
JSONObject json=new JSONObject(improvedInputStreamAsString);
JSONObject json1=json.getJSONObject("children");
答案 2 :(得分:3)
我会为此推荐两个库,一个已在上面提到,但为了清楚起见。
<强>杰克逊强>
<强> GSON 强>
答案 3 :(得分:2)
答案 4 :(得分:2)
我的问题是
keys.next()
不会按预期返回对象,而是返回迭代器的下一个键。因此,尝试以下
while(keys.hasNext()) {
String key = keys.next();
if(key.equals("children")) {
//this might throw exception, surround with try catch block
JSONObject newJsn = new JSONObject(json.get(key));
if(newJsn.has("name")) {
String category = newJsn.getString("name");
categories.put("categories", category);
}
}
}
由于JSON字符串似乎重复单一格式,因此最好编写一个递归函数来完成任务。
答案 5 :(得分:0)
首先让你的Json有效
String str="{ \"position\": \"0\", \"children\": [ { \"position\": \"1\", \"children\": [ { \"position\": \"1\", \"children\": [ { \"position\": \"3\", \"children\": [], \"category_id\": \"9\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Exfoliants\", \"parent_id\": \"4\" }, { \"position\": \"4\", \"children\": [], \"category_id\": \"10\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Moisturisers\", \"parent_id\": \"4\" }, { \"position\": \"5\", \"children\": [], \"category_id\": \"11\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Treatments\", \"parent_id\": \"4\" }, { \"position\": \"6\", \"children\": [], \"category_id\": \"12\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Cleansers\", \"parent_id\": \"4\" }, { \"position\": \"7\", \"children\": [], \"category_id\": \"13\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Skin Toners\", \"parent_id\": \"4\" }, { \"position\": \"9\", \"children\": [], \"category_id\": \"15\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Serums\", \"parent_id\": \"4\" }, { \"position\": \"10\", \"children\": [], \"category_id\": \"36\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Acne and Blemish Treatments\", \"parent_id\": \"4\" }, { \"position\": \"11\", \"children\": [], \"category_id\": \"40\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Oils\", \"parent_id\": \"4\" } ], \"category_id\": \"4\", \"level\": \"2\", \"is_active\": \"1\", \"name\": \"Skincare\", \"parent_id\": \"2\" }, { \"position\": \"2\", \"children\": [ { \"position\": \"1\", \"children\": [], \"category_id\": \"16\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Sunscreen\", \"parent_id\": \"5\" }, { \"position\": \"2\", \"children\": [], \"category_id\": \"31\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Insect Repellent & After Bite\", \"parent_id\": \"5\" }, { \"position\": \"3\", \"children\": [], \"category_id\": \"32\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"After Sun Lotions\", \"parent_id\": \"5\" }, { \"position\": \"4\", \"children\": [], \"category_id\": \"33\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Self Tanning Lotions\", \"parent_id\": \"5\" } ], \"category_id\": \"5\", \"level\": \"2\", \"is_active\": \"1\", \"name\": \"Suncare\", \"parent_id\": \"2\" }, { \"position\": \"3\", \"children\": [ { \"position\": \"1\", \"children\": [], \"category_id\": \"17\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Shampoo\", \"parent_id\": \"6\" }, { \"position\": \"2\", \"children\": [], \"category_id\": \"18\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Conditioner\", \"parent_id\": \"6\" }, { \"position\": \"3\", \"children\": [], \"category_id\": \"19\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Treatments\", \"parent_id\": \"6\" }, { \"position\": \"4\", \"children\": [], \"category_id\": \"20\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Toner\", \"parent_id\": \"6\" }, { \"position\": \"6\", \"children\": [], \"category_id\": \"34\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Styling\", \"parent_id\": \"6\" }, { \"position\": \"7\", \"children\": [], \"category_id\": \"39\", \"level\": \"3\", \"is_active\": \"1\", \"name\": \"Serum\", \"parent_id\": \"6\" } ], \"category_id\": \"6\", \"level\": \"2\", \"is_active\": \"1\", \"name\": \"Hair\", \"parent_id\": \"2\" } ] } ]}";
现在在你的json中,你在JSONArray中有JSONArray,它在另一个JSONArray中。 所以你必须使用3 for loop作为
try
{
JSONObject job1=new JSONObject(str);
JSONArray jarr1=job1.getJSONArray("children");
for(int i=0;i<jarr1.length();i++)
{
JSONObject job2=new JSONObject(jarr1.getString(i));
JSONArray jarr2=job2.getJSONArray("children");
for(int j=0;j<jarr2.length();j++)
{
JSONObject job3=new JSONObject(jarr2.getString(j));
System.out.println("job3........"+job3);
JSONArray jarr3=job3.getJSONArray("children");
for(int k=0;k<jarr3.length();k++)
{
JSONObject job4=new JSONObject(jarr3.getString(k));
System.out.println("name.........."+job4.getString("name"));
}
}
}
}
catch (Exception e) {
System.out.println("ex..................."+e);
e.printStackTrace();
}
它将为您提供所需的名称字段。只需尝试此代码。