2014-11-09 1 views
1

다음은 데모 목적으로 만 세 개만 가지고있는 JSON입니다.하지만 일반적으로 가끔은 꽤 큰 JSON을 얻습니다. 그 다음에 세 개가 없습니다. reportRecords, 의 수가 많습니다. GSON 스트리밍을 사용하여 전체 JSON을 메모리에로드하지 않으려면 어떻게해야하나요?

{ 
    "aggRecords":{ 
     "reportRecords":[ 
     { 
      "min":1.0, 
      "max":1.0, 
      "avg":1.0, 
      "count":18, 
      "sumSq":18.0, 
      "stddev":0.0, 
      "median":1.0, 
      "percentileMap":{ 
       "95":1 
      }, 
      "metricName":"TotalCount", 
      "dimensions":{ 
       "env":"prod", 
       "pool":"hawk", 
       "Name":"CORE_utrade11", 
       "Type":"Error" 
      }, 
      "value":18.0 
     }, 
     { 
      "min":1.0, 
      "max":1.0, 
      "avg":1.0, 
      "count":25968842, 
      "sumSq":2.5968842E7, 
      "stddev":0.0, 
      "median":1.0, 
      "percentileMap":{ 
       "95":1 
      }, 
      "metricName":"TotalCount", 
      "dimensions":{ 
       "env":"prod", 
       "pool":"hawk", 
       "Name":"ResponseHeaders", 
       "Type":"ConnectionPool" 
      }, 
      "value":2.5968842E7 
     }, 
     { 
      "min":1.0, 
      "max":1.0, 
      "avg":1.0, 
      "count":44, 
      "sumSq":44.0, 
      "stddev":0.0, 
      "median":1.0, 
      "percentileMap":{ 
       "95":1 
      }, 
      "metricName":"TotalCount", 
      "dimensions":{ 
       "env":"prod", 
       "pool":"hawk", 
       "Name":"read-lookup", 
       "Type":"ClientPool" 
      }, 
      "value":44.0 
     } 
     ] 
    }, 
    "minRecordsMap":{ 

    } 
} 

는 지금은 추출 JSON 위의 직렬화하려고 그 누구의 Type ClientPool하고 ConnectionPool은 그래서 메모리의 모든 내용을로드하지 않으 reportRecords. 그리고 이것에 대해 GSON Streaming을 사용하려고 생각하지만 지금까지는이 작업을 수행 할 수 없습니다.

private static List<HostClientMetrics> loadMetrics(String url) { 
    List<HostClientMetrics> metrics = new ArrayList<HostClientMetrics>(); 
    try { 
     InputStream input = new URL(url).openStream(); 
     JsonReader reader = new JsonReader(new InputStreamReader(input, "UTF-8")); 

     // not sure what I should do here? 
    } catch (Exception ex) { 
     // log error 
    } 

    return metrics; 
} 

다음은 그냥 추출 할 필요가 내 HostClientMetrics 클래스

public class HostClientMetrics { 

    private String metricName; 
    private Map<String, Integer> percentileMap; 
    private String median; 
    private String stddev; 
    private String sumSq; 
    private String count; 
    private String avg; 
    private String max; 
    private String min; 

    public String getMetricName() { 
     return metricName; 
    } 

    public Map<String, Integer> getPercentileMap() { 
     return percentileMap; 
    } 

    public String getMedian() { 
     return median; 
    } 

    public String getStddev() { 
     return stddev; 
    } 

    public String getSumSq() { 
     return sumSq; 
    } 

    public String getCount() { 
     return count; 
    } 

    public String getAvg() { 
     return avg; 
    } 

    public String getMax() { 
     return max; 
    } 

    public String getMin() { 
     return min; 
    } 

    public Dimensions getDimensions() { 
     return dimensions; 
    } 

    public Dimensions dimensions; 

    public static class Dimensions { 
     private String env; 
     private String pool; 
     @SerializedName("Name") 
     private String name; 

     public String getEnv() { 
      return env; 
     } 

     public String getPool() { 
      return pool; 
     } 

     public String getName() { 
      return name; 
     } 
    } 
} 

입니다 그 reportRecordsTypeClientPoolConnectionPool 전용입니다. 필자의 예에서는 GSON Streaming을 어떻게 사용할 수 있습니까? 당신의 Diemensions POJO에

답변

1
private static List<HostClientMetrics> loadMetrics(String url) { 

    GsonBuilder gsonBuilder = new GsonBuilder(); 
    Gson gson = gsonBuilder.create(); 

    List<HostClientMetrics> metrics = new ArrayList<HostClientMetrics>(); 

    try { 
     InputStream input = new URL(url).openStream(); 
     JsonReader reader = new JsonReader(new InputStreamReader(input, "UTF-8")); 

     reader.beginObject(); 

     String jsonTag = null; 

     while(reader.hasNext()) { 
      jsonTag = reader.nextName(); 
      if("aggRecords".equals(jsonTag)) { 
       reader.beginObject(); 

       while(reader.hasNext()) { 
        jsonTag = reader.nextName(); 
        if("reportRecords".equals(jsonTag)) { 
         reader.beginArray(); 
         while (reader.hasNext()) { 
          HostClientMetrics hostClientMetrics = gson.fromJson(reader, HostClientMetrics.class); 
          if ("ClientPool".equals(hostClientMetrics.dimensions.type) || "ConnectionPool".equals(hostClientMetrics.dimensions.type)) { 
           metrics.add(hostClientMetrics); 
          } 
         } 
         reader.endArray(); 
        } 
       } 
       reader.endObject(); 
      } else if("minRecordsMap".equals(jsonTag)) { 
       reader.beginObject(); 
       // skip 
       reader.endObject(); 
      } 
     } 

     reader.endObject(); 

     reader.close(); 
     return metrics; 
    } catch (Exception ex) { 
     // log error 
     System.out.println("ex:" + ex); 
    } 

    return metrics; 
} 

추가 유형 필드 :

public static class Dimensions { 
    private String env; 
    private String pool; 
    @SerializedName("Name") 
    private String name; 

    @SerializedName("Type") 
    private String type; 

    // Getters/Setters 
} 
관련 문제