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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 00:30:06  来源:igfitidea点击:

Parsing JSON by using gson

javajsongson

提问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 pieentry 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

以上都对我有用,谢谢你的帮助