Java 使用 gson 解析 JSON
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18322829/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Parsing JSON by using gson
提问by Tom
{
"took": 6200,
"timed_out": false,
"_shards": {
"total": 68,
"successful": 68,
"failed": 0
},
"hits": {
"total": 110745094,
"max_score": 1,
"hits": []
},
"facets": {
"pie": {
"_type": "terms",
"missing": 135,
"total": 29349,
"other": 26420,
"terms": [
{
"term": "165.130.136.210",
"count": 390
},
{
"term": "165.130.136.206",
"count": 381
},
{
"term": "205.138.114.8",
"count": 359
},
{
"term": "205.138.115.229",
"count": 334
},
{
"term": "165.130.136.208",
"count": 331
},
{
"term": "66.37.212.155",
"count": 283
},
{
"term": "209.67.71.137",
"count": 279
},
{
"term": "66.37.204.17",
"count": 201
},
{
"term": "64.28.92.213",
"count": 193
},
{
"term": "64.85.64.202",
"count": 178
}
]
}
}
}
I am trying to parse the following, I've tried many API, by using JSon in perl and JSon.simple, gson in Java without luck.
我正在尝试解析以下内容,我尝试了很多 API,通过在 perl 和 JSon.simple 中使用 JSon,在 Java 中使用 gson 没有运气。
What I am trying to parse out is facets=>pie=>terms=>term and count, can someone give me a hint on how to extract both values?
我试图解析的是 facets=>pie=>terms=>term 和 count,有人能给我一个关于如何提取这两个值的提示吗?
Here is what I have so far
这是我到目前为止所拥有的
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class TrueIPMonitor {
public static void main(String[] args) {
String json = getJson();
System.out.println(json);
System.out.println(parse(json));
}
public static String parse(String jsonLine) {
JsonElement jelement = new JsonParser().parse(jsonLine);
JsonObject jobject = jelement.getAsJsonObject();
jobject = jobject.getAsJsonObject("facets");
JsonArray jarray = jobject.getAsJsonArray("pie");
jobject = jarray.get(0).getAsJsonObject();
String result = jobject.get("terms").toString();
return result;
}
public static String getJson() {
BufferedReader br;
String json = "";
try {
br = new BufferedReader(new FileReader("script/curlJson.log"));
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append('\n');
line = br.readLine();
}
json = sb.toString();
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return json;
}
}
{ "took" : 6200, "timed_out" : false, "_shards" : { "total" : 68, "successful" : 68, "failed" : 0 }, "hits" : { "total" : 110745094, "max_score" : 1.0, "hits" : [ ] }, "facets" : { "pie" : { "_type" : "terms", "missing" : 135, "total" : 29349, "other" : 26420, "terms" : [ { "term" : "165.130.136.210", "count" : 390 }, { "term" : "165.130.136.206", "count" : 381 }, { "term" : "205.138.114.8", "count" : 359 }, { "term" : "205.138.115.229", "count" : 334 }, { "term" : "165.130.136.208", "count" : 331 }, { "term" : "66.37.212.155", "count" : 283 }, { "term" : "209.67.71.137", "count" : 279 }, { "term" : "66.37.204.17", "count" : 201 }, { "term" : "64.28.92.213", "count" : 193 }, { "term" : "64.85.64.202", "count" : 178 } ] } } }
Exception in thread "main" java.lang.ClassCastException: com.google.gson.JsonObject cannot be cast to com.google.gson.JsonArray
at com.google.gson.JsonObject.getAsJsonArray(JsonObject.java:172)
at com.xxx.perf.monitor.TrueIPMonitor.parse(TrueIPMonitor.java:36)
at com.xxx.perf.monitor.TrueIPMonitor.main(TrueIPMonitor.java:28)
回答by amon
Your JSON is OK. Here is a Perl snippet that prints out all terms and counts:
你的 JSON 没问题。这是一个打印出所有术语和计数的 Perl 片段:
...;
my $json = decode_json $input;
for my $term (@{ $json->{facets}{pie}{terms} }) {
printf "%15s: %s\n", @$term{qw/term count/};
}
Output:
输出:
165.130.136.210: 390
165.130.136.206: 381
205.138.114.8: 359
205.138.115.229: 334
165.130.136.208: 331
66.37.212.155: 283
209.67.71.137: 279
66.37.204.17: 201
64.28.92.213: 193
64.85.64.202: 178
The problem in your Java code is that the pie
entry does not point to an JSON array, rather it contains an JSON object.
您的 Java 代码中的问题是该pie
条目不指向 JSON 数组,而是包含一个 JSON 对象。
facets : object
`- pie : object
`- terms : array
Your probably wanted (untested, and debatable style):
您可能想要(未经测试且有争议的风格):
public static String parse(String jsonLine) {
JsonObject root = new JsonParser().parse(jsonLine).getAsJsonObject();
JsonArray terms = root.getAsJsonObject("facets").getAsJsonObject("pie").getAsJsonArray("terms")
JsonOject firstTerm = terms.get(0).getAsJsonObject();
String result = firstTerm.get("terms").toString();
return result;
}
回答by Lorenzo Baracchi
JsonArray jarray = jobject.getAsJsonArray("pie");
"pie" is an object, but you are accessing it as an array. First you should get the "pie" object then he array, which is "terms".
“pie”是一个对象,但您将它作为数组访问。首先你应该得到“pie”对象,然后是他的数组,即“terms”。
回答by Tom
gson
格森
public static void main(String[] args) {
String json = getJson();
System.out.println(json);
parse(json);
}
public static void parse(String jsonLine) {
JsonObject root = new JsonParser().parse(jsonLine).getAsJsonObject();
JsonArray terms = root.getAsJsonObject("facets").getAsJsonObject("pie")
.getAsJsonArray("terms");
for (int i = 0; i < terms.size(); i++) {
JsonObject term = terms.get(i).getAsJsonObject();
System.out.printf("%s - %s \n", term.get("term").toString(), term.get("count").toString());
}
}
Perl
珀尔
my $json = decode_json $input;
for my $term (@{ $json->{facets}{pie}{terms} }) {
printf "%15s: %s\n", @$term{qw/term count/};
}
Above both worked for me, thanks for your help
以上都对我有用,谢谢你的帮助