Java 8 JSON-simple - 我如何阅读子项目?
Java 8 JSON-simple - How can i read a subitem?
我在 Java 中遇到问题,特别是在使用 JSON-simple 库时。我在这里找到了一个代码,它们确实在 json-file 的 parent 节点级别工作,但在我的情况下,我读了 json-file 和 parent 下的孩子s.
Link 到代码:How to read json file into java with simple JSON library
在 DB-Language 中:我有一个包含一些表的数据库。现在,我只能读取 "select * from table" 但我想从中读取列(或属性)。
结构(原始数据json):
{
"PARENT1":
{
"child_attr1":"0.00","child_attr2":"0.30"
},
"PARENT2":
{
"child_attr1":"0.10","child_attr2":"0.12"
},
"PARENT3":
{
"child_attr1":"0.03","child_attr2":"0.45"
}
}
代码:
public static HttpResponse http(String url, String body) {
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpPost request = new HttpPost(url);
StringEntity params = new StringEntity(body);
request.addHeader("content-type", "application/json");
request.setEntity(params);
HttpResponse result = httpClient.execute(request);
String json_content = EntityUtils.toString(result.getEntity(), "UTF-8");
//System.out.println(json_content);
try {
JSONParser parser = new JSONParser();
Object resultObject = parser.parse(json_content);
if (resultObject instanceof JSONArray) {
JSONArray array=(JSONArray)resultObject;
for (Object object : array) {
JSONObject obj =(JSONObject)object;
System.out.println(obj.get("Parent"));
System.out.println(obj.get("Child"));
//System.out.println("case1");
}
} else if (resultObject instanceof JSONObject) {
JSONObject obj =(JSONObject)resultObject;
System.out.println(obj.get("PARENT2"));
//System.out.println("case2");
//THIS KNOT WORKS BUT IT GIVES ME ALL VALUES OF THE ATTRIBUTES
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
您有 1 个 "root" JSONObject
,包含 3 个节点,每个节点都是 JSONObject
的一个实例。这 3 个节点每个包含 2 个嵌套节点。如果遍历结构,json-simple 会将这些视为字符串。
要打印出 parent 的内容,您必须执行类似于以下操作的操作:
JSONParser parser = new JSONParser();
JSONObject parents = (JSONObject) parser.parse(new FileReader("filename"));
JSONObject parent1 = (JSONObject) parents.get("PARENT1");
JSONObject parent2 = (JSONObject) parents.get("PARENT2");
JSONObject parent3 = (JSONObject) parents.get("PARENT3");
System.out.println("Parent 1");
System.out.println("\tChild 1: " + parent1.get("child_attr1"));
System.out.println("\tChild 2: " + parent1.get("child_attr2"));
System.out.println("Parent 2");
System.out.println("\tChild 1: " + parent2.get("child_attr1"));
System.out.println("\tChild 2: " + parent2.get("child_attr2"));
System.out.println("Parent 3");
System.out.println("\tChild 1: " + parent3.get("child_attr1"));
System.out.println("\tChild 2: " + parent3.get("child_attr2"));
这会输出
Parent 1
Child 1: 0.00
Child 2: 0.30
Parent 2
Child 1: 0.10
Child 2: 0.12
Parent 3
Child 1: 0.03
Child 2: 0.45
如果您希望能够遍历所有 child,您应该将每个 parent 定义为 JSONArray
,并将每个 child 定义为 JSONObject
{
"PARENT1": [
{"child_attr1": "0.00"},
{"child_attr2": "0.30"}
],
"PARENT2": [
{"child_attr1": "0.10"},
{"child_attr2": "0.12"}
],
"PARENT3": [
{"child_attr1": "0.14"},
{"child_attr2": "0.45"}
]
}
如果您的结构始终遵循此示例:1 个根 object 和 x-amount parent 数组 object,每个 y-amount child objects,其中 child objects 从来没有任何嵌套节点,一种遍历所有节点的方法是:
Iterator<?> i = parents.keySet().iterator();
// Alternative, if you don't need the name of the key of the parent node:
// Iterator<?> i = parents.values().iterator();
while(i.hasNext()) {
String parentKey = (String) i.next();
JSONArray p = (JSONArray) parents.get(parentKey);
System.out.println(parentKey);
// If you don't need the name of the parent key node,
// replace the above with:
// JSONArray p = (JSONArray) i.next();
// Remember to use the alternative iterator-definition above as well
for(Object o : p) {
JSONObject child = (JSONObject) o;
System.out.println("\t" + child.keySet() + ": " + child.values());
}
}
以上(带有 parent 个节点名称)将输出:
PARENT1
[child_attr1]: [0.00]
[child_attr2]: [0.30]
PARENT3
[child_attr1]: [0.14]
[child_attr2]: [0.25]
PARENT2
[child_attr1]: [0.10]
[child_attr2]: [0.12]
在child节点上调用#keySet()
和#values()
时,会return分别作为一个Set和一个Collection。当在这些上使用 #toString()
时,输出将被打印在方括号 ([keys/values]
) 中。您当然可以只要求一个数组,然后是第一个条目,以获得孤独的 key/value:child.keySet().toArray()[0]
和 child.values().toArray()[0]
。这当然行不通,如果你有嵌套节点 inside 你的 child 节点 - 在这种情况下,它只会打印特定的第一个 key/value节点。
我在 Java 中遇到问题,特别是在使用 JSON-simple 库时。我在这里找到了一个代码,它们确实在 json-file 的 parent 节点级别工作,但在我的情况下,我读了 json-file 和 parent 下的孩子s.
Link 到代码:How to read json file into java with simple JSON library
在 DB-Language 中:我有一个包含一些表的数据库。现在,我只能读取 "select * from table" 但我想从中读取列(或属性)。
结构(原始数据json):
{
"PARENT1":
{
"child_attr1":"0.00","child_attr2":"0.30"
},
"PARENT2":
{
"child_attr1":"0.10","child_attr2":"0.12"
},
"PARENT3":
{
"child_attr1":"0.03","child_attr2":"0.45"
}
}
代码:
public static HttpResponse http(String url, String body) {
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpPost request = new HttpPost(url);
StringEntity params = new StringEntity(body);
request.addHeader("content-type", "application/json");
request.setEntity(params);
HttpResponse result = httpClient.execute(request);
String json_content = EntityUtils.toString(result.getEntity(), "UTF-8");
//System.out.println(json_content);
try {
JSONParser parser = new JSONParser();
Object resultObject = parser.parse(json_content);
if (resultObject instanceof JSONArray) {
JSONArray array=(JSONArray)resultObject;
for (Object object : array) {
JSONObject obj =(JSONObject)object;
System.out.println(obj.get("Parent"));
System.out.println(obj.get("Child"));
//System.out.println("case1");
}
} else if (resultObject instanceof JSONObject) {
JSONObject obj =(JSONObject)resultObject;
System.out.println(obj.get("PARENT2"));
//System.out.println("case2");
//THIS KNOT WORKS BUT IT GIVES ME ALL VALUES OF THE ATTRIBUTES
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
您有 1 个 "root" JSONObject
,包含 3 个节点,每个节点都是 JSONObject
的一个实例。这 3 个节点每个包含 2 个嵌套节点。如果遍历结构,json-simple 会将这些视为字符串。
要打印出 parent 的内容,您必须执行类似于以下操作的操作:
JSONParser parser = new JSONParser();
JSONObject parents = (JSONObject) parser.parse(new FileReader("filename"));
JSONObject parent1 = (JSONObject) parents.get("PARENT1");
JSONObject parent2 = (JSONObject) parents.get("PARENT2");
JSONObject parent3 = (JSONObject) parents.get("PARENT3");
System.out.println("Parent 1");
System.out.println("\tChild 1: " + parent1.get("child_attr1"));
System.out.println("\tChild 2: " + parent1.get("child_attr2"));
System.out.println("Parent 2");
System.out.println("\tChild 1: " + parent2.get("child_attr1"));
System.out.println("\tChild 2: " + parent2.get("child_attr2"));
System.out.println("Parent 3");
System.out.println("\tChild 1: " + parent3.get("child_attr1"));
System.out.println("\tChild 2: " + parent3.get("child_attr2"));
这会输出
Parent 1
Child 1: 0.00
Child 2: 0.30
Parent 2
Child 1: 0.10
Child 2: 0.12
Parent 3
Child 1: 0.03
Child 2: 0.45
如果您希望能够遍历所有 child,您应该将每个 parent 定义为 JSONArray
,并将每个 child 定义为 JSONObject
{
"PARENT1": [
{"child_attr1": "0.00"},
{"child_attr2": "0.30"}
],
"PARENT2": [
{"child_attr1": "0.10"},
{"child_attr2": "0.12"}
],
"PARENT3": [
{"child_attr1": "0.14"},
{"child_attr2": "0.45"}
]
}
如果您的结构始终遵循此示例:1 个根 object 和 x-amount parent 数组 object,每个 y-amount child objects,其中 child objects 从来没有任何嵌套节点,一种遍历所有节点的方法是:
Iterator<?> i = parents.keySet().iterator();
// Alternative, if you don't need the name of the key of the parent node:
// Iterator<?> i = parents.values().iterator();
while(i.hasNext()) {
String parentKey = (String) i.next();
JSONArray p = (JSONArray) parents.get(parentKey);
System.out.println(parentKey);
// If you don't need the name of the parent key node,
// replace the above with:
// JSONArray p = (JSONArray) i.next();
// Remember to use the alternative iterator-definition above as well
for(Object o : p) {
JSONObject child = (JSONObject) o;
System.out.println("\t" + child.keySet() + ": " + child.values());
}
}
以上(带有 parent 个节点名称)将输出:
PARENT1
[child_attr1]: [0.00]
[child_attr2]: [0.30]
PARENT3
[child_attr1]: [0.14]
[child_attr2]: [0.25]
PARENT2
[child_attr1]: [0.10]
[child_attr2]: [0.12]
在child节点上调用#keySet()
和#values()
时,会return分别作为一个Set和一个Collection。当在这些上使用 #toString()
时,输出将被打印在方括号 ([keys/values]
) 中。您当然可以只要求一个数组,然后是第一个条目,以获得孤独的 key/value:child.keySet().toArray()[0]
和 child.values().toArray()[0]
。这当然行不通,如果你有嵌套节点 inside 你的 child 节点 - 在这种情况下,它只会打印特定的第一个 key/value节点。