3
{
    "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
                }
            ]
        }
    }
}

我正在尝试解析以下内容,我尝试了很多 API,通过在 perl 中使用 JSon 和 JSon.simple,在 Java 中使用 gson 没有运气。

我要解析的是 facets=>pie=>terms=>term 和 count,有人可以提示我如何提取这两个值吗?

这是我到目前为止所拥有的

    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)
4

3 回答 3

3

你的 JSON 没问题。这是一个打印出所有术语和计数的 Perl 片段:

...;
my $json = decode_json $input;

for my $term (@{ $json->{facets}{pie}{terms} }) {
    printf "%15s: %s\n", @$term{qw/term count/};
}

输出:

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

Java 代码中的问题是该pie条目不指向 JSON 数组,而是包含一个 JSON 对象。

facets : object
 `- pie : object
     `- terms : array

您可能想要的(未经测试且有争议的风格):

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;
}
于 2013-08-19T21:11:06.557 回答
2

格森

    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/};
}

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

于 2013-08-19T21:40:31.237 回答
0
JsonArray jarray = jobject.getAsJsonArray("pie");

“pie”是一个对象,但您将它作为一个数组访问。首先你应该得到“pie”对象,然后是他的数组,即“terms”。

于 2013-08-19T21:14:05.363 回答