2013-08-19 5 views
2
{ 
    "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, с помощью JSON в Perl и JSon.simple, gson в Java без удачи.Разбор JSON с помощью gson

То, что я пытаюсь разобрать, это facets => pie => terms => term and 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) 
+0

Что вы пытались сделать до сих пор? На каком языке вы в первую очередь надеетесь использовать? –

+0

Мы не можем сказать вам, что вы сделали неправильно, если не указали нам свой код. – ikegami

+0

@Tom: удалите комментарий и добавьте код на вопрос (так что его легче читать). –

ответ

2

Ваш 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; 
} 
0
JsonArray jarray = jobject.getAsJsonArray("pie"); 

"пирог" является объектом, но вы к нему доступ как массив. Сначала вы должны получить объект «пирог», затем массив, который является «термином».

2

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

Над оба работали для меня, спасибо за вашу помощь

Смежные вопросы