2016-05-11 3 views
-1

を特定のデータを取得することは、私のJSONファイルです:私は単にこのJSON(「1453150800」のような値が含まれ、内側1、「だけから「データ」の配列を取得したいJSONファイルからここ

{ 
    "success":true, 
    "data":{ 
     "charts":[ 

     ], 
     "title":"Dane pomiarowe dla stacji Nowa Huta w dniu 18.01.2016 r.", 
     "unitLabel":"&micro;g\/m<sup>3<\/sup>", 
     "series":[ 
     { 
      "label":"Py\u0142 zawieszony PM10", 
      "measType":"auto", 
      "paramLabel":"Py\u0142 zawieszony PM10", 
      "paramId":"pm10", 
      "paramCode":"PM10", 
      "paramPostfix":"", 
      "aggType":"A1h", 
      "ord":7, 
      "interval":3600, 
      "count":24, 
      "retroCount":2, 
      "startTime":1453075200, 
      "extStartTime":1453068000, 
      "coverageRate":0.75, 
      "isAvgValid":true, 
      "thresholds":{ 
       "at":null, 
       "it":null, 
       "tv":null, 
       "lv":null, 
       "atDecimals":0, 
       "itDecimals":0, 
       "tvDecimals":0, 
       "lvDecimals":0 
      }, 
      "data":[ 
       [ 
        "1453068000", 
        "103.298" 
       ], 
       [ 
        "1453071600", 
        "91.7082" 
       ], 
       [ 
        "1453075200", 
        "77.0336" 
       ], 
       [ 
        "1453078800", 
        "64.5983" 
       ], 
       [ 
        "1453082400", 
        "63.8732" 
       ], 
       [ 
        "1453086000", 
        "70.7411" 
       ], 
       [ 
        "1453089600", 
        "53.5375" 
       ], 
       [ 
        "1453093200", 
        "34.263" 
       ], 
       [ 
        "1453096800", 
        "41.0388" 
       ], 
       [ 
        "1453100400", 
        "67.2149" 
       ], 
       [ 
        "1453104000", 
        "92.7306" 
       ], 
       [ 
        "1453107600", 
        "99.2169" 
       ], 
       [ 
        "1453111200", 
        "48.8264" 
       ], 
       [ 
        "1453114800", 
        "33.3165" 
       ], 
       [ 
        "1453118400", 
        "36.2634" 
       ], 
       [ 
        "1453122000", 
        "28.4299" 
       ], 
       [ 
        "1453125600", 
        "28.5989" 
       ], 
       [ 
        "1453129200", 
        "39.2745" 
       ], 
       [ 
        "1453132800", 
        "50.3268" 
       ], 
       [ 
        "1453136400", 
        "100.369" 
       ], 
       [ 
        "1453140000", 
        "110.177" 
       ], 
       [ 
        "1453143600", 
        "106.337" 
       ], 
       [ 
        "1453147200", 
        "81.9495" 
       ], 
       [ 
        "1453150800", 
        "67.9702" 
       ], 
       [ 
        "1453154400", 
        "77.114" 
       ], 
       [ 
        "1453158000", 
        "115.15" 
       ] 
      ], 
      "avg":{ 
       "avg":"66.1813", 
       "min":"28.4299", 
       "max":"115.15" 
      }, 
      "thresholdsForAvg":{ 
       "avg":{ 
        "at":300, 
        "it":200, 
        "tv":null, 
        "lv":50, 
        "atDecimals":0, 
        "itDecimals":0, 
        "tvDecimals":0, 
        "lvDecimals":0 
       }, 
       "min":null, 
       "max":null 
      }, 
      "decimals":0, 
      "unit":"ug\/m3", 
      "unitLabel":"&micro;g\/m<sup>3<\/sup>", 
      "scaleMin":null, 
      "scaleMax":null, 
      "chartTooltipContent":"%y.# %ly o godz. %x" 
     } 
     ], 
     "dateFormat":"H:00", 
     "viewType":"station" 
    } 
} 

67.9702」)。

これは私が(ポール・ヒックスからの助けを借りて)これまでのコード化されたものです:

static class Measurement { 
    int time; 
    double pm; 
    public String toString() { 
     return "Time: " + time + " Pm: " + pm; 
    } 
} 

static class Measurements { 
    List<Measurement> data; 
} 

... 
String str = "{\"success\":true,\"data\":{\"charts\":[],\"title\":\"Dane pomiarowe dla stacji Nowa Huta w dniu 18.01.2016 r.\",\"unitLabel\":\"&micro;g\\/m<sup>3<\\/sup>\",\"series\":[{\"label\":\"Py\\u0142 zawieszony PM10\",\"measType\":\"auto\",\"paramLabel\":\"Py\\u0142 zawieszony PM10\",\"paramId\":\"pm10\",\"paramCode\":\"PM10\",\"paramPostfix\":\"\",\"aggType\":\"A1h\",\"ord\":7,\"interval\":3600,\"count\":24,\"retroCount\":2,\"startTime\":1453075200,\"extStartTime\":1453068000,\"coverageRate\":0.75,\"isAvgValid\":true,\"thresholds\":{\"at\":null,\"it\":null,\"tv\":null,\"lv\":null,\"atDecimals\":0,\"itDecimals\":0,\"tvDecimals\":0,\"lvDecimals\":0},\"data\":[[\"1453068000\",\"103.298\"],[\"1453071600\",\"91.7082\"],[\"1453075200\",\"77.0336\"],[\"1453078800\",\"64.5983\"],[\"1453082400\",\"63.8732\"],[\"1453086000\",\"70.7411\"],[\"1453089600\",\"53.5375\"],[\"1453093200\",\"34.263\"],[\"1453096800\",\"41.0388\"],[\"1453100400\",\"67.2149\"],[\"1453104000\",\"92.7306\"],[\"1453107600\",\"99.2169\"],[\"1453111200\",\"48.8264\"],[\"1453114800\",\"33.3165\"],[\"1453118400\",\"36.2634\"],[\"1453122000\",\"28.4299\"],[\"1453125600\",\"28.5989\"],[\"1453129200\",\"39.2745\"],[\"1453132800\",\"50.3268\"],[\"1453136400\",\"100.369\"],[\"1453140000\",\"110.177\"],[\"1453143600\",\"106.337\"],[\"1453147200\",\"81.9495\"],[\"1453150800\",\"67.9702\"],[\"1453154400\",\"77.114\"],[\"1453158000\",\"115.15\"]],\"avg\":{\"avg\":\"66.1813\",\"min\":\"28.4299\",\"max\":\"115.15\"},\"thresholdsForAvg\":{\"avg\":{\"at\":300,\"it\":200,\"tv\":null,\"lv\":50,\"atDecimals\":0,\"itDecimals\":0,\"tvDecimals\":0,\"lvDecimals\":0},\"min\":null,\"max\":null},\"decimals\":0,\"unit\":\"ug\\/m3\",\"unitLabel\":\"&micro;g\\/m<sup>3<\\/sup>\",\"scaleMin\":null,\"scaleMax\":null,\"chartTooltipContent\":\"%y.# %ly o godz. %x\"}],\"dateFormat\":\"H:00\",\"viewType\":\"station\"}}"; 

JsonParser parser = new JsonParser(); 
JsonObject element = (JsonObject)parser.parse(str); 

JsonElement responseWrapper = element.getAsJsonObject("data") 
           .getAsJsonArray("series").get(0) 
           .getAsJsonObject().get("data"); 

Gson gson = new Gson(); 
Measurements measurements = gson.fromJson(responseWrapper, Measurements.class); 
for (Measurement m : measurements.data) System.out.println(m); 

私はエラーを取得:行で

IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY 

Measurements measurements = gson.fromJson(responseWrapper, Measurements.class); 
+1

リストオブジェクトではなく、リストの内容を印刷してみます。 'for(測定m:測定値){System.out.println(m.pm); } '。これらのクラスにいくつかのtoStringメソッドも追加する必要があります。 –

+0

あなたが提供したコードを使用してNullPointerExceptionを取得します。申し訳ありませんが、私はJavaの初心者です。私のクラスにtoStringメソッドを追加するには?ゲッターのように見えますか? – Defozo

+0

JSONには2つの 'data'要素があります。あなたのコードは、最初のコードを抽出していますが、2番目のコードは抽出していません。また、@ Paul Hicksの言葉通り、Measurementsオブジェクトをそのまま印刷することはできません。囲まれた変数/配列を出力するMeasurements and MeasurementにtoString()メソッドを記述します。 – Jason

答えて

-1

まず、あなたのSystem.out.println()問題については、MeasurementクラスにtoString()メソッドを定義し、これを使用してください:

System.out.println(Arrays.toString(measurements.toArray())); 

ここでのキーポイントはSystem.out.println()を使って素敵な結果を持っているために、すべてのオブジェクトにtoString()メソッドを定義することであり、また目的

第二のデバッグのために、あなたのJSONの問題のために、問題はそのあなたのですMeasurementsクラスはあなたのJSONを尊重しません。そして、element.get("data")は最初のブロックを取得し、最も深いものは取得しません。

あなたはもっと深く進む必要があります。あなたのコードから何かを変更することなく、これらのいずれかにあなたのクラスを変更します。

class Measurements { 
     Serie[] series; 
} 

class Serie { 
    String label; 
    Object[][] data; // First will be number of line, second the two values. 
    // eg. data[0][0] will be the integer of the first line :) 
} 

次に、あなたが持っているとき: Object[][] datas = measurements.serie[0].data

をあなたが最初のセリエのためにすべてのデータを持っている、[ライン] [0]意志intであり、[line] [1]はdoubleになります。

+0

'メソッドを解決できません 'toArray()' ' – Defozo

+0

両方のソリューションを同時に使用することはできません...最初の点を一般的なアドバイスとして、2番目の点を質問の答えとして... – Guillaume

+0

gson.fromJson()に割り当てる必要がありますか? – Defozo

-1

JSONスニペットからデータを解析するのに正しいことをしているようです。あなたの問題は、解析されたオブジェクトを取得した後にデータにアクセスすることにあります。

まず、JSONObjectをナビゲートして、必要な特定のノードに移動する必要があります。これは、(elementJsonParser.parseによって返されたトップレベルのノードであると仮定して)より深く、ネストされた「データ」の要素になります:

JsonElement responseWrapper = element.getAsJsonObject("data") 
            .getAsJsonArray("series").get(0) 
            .getAsJsonObject().get("data"); 

これはあなたの測定値オブジェクトがあなたに何を与えるべきである意味、既存のコードで動作しますあなたが必要です。 get(0)から、 "series"配列内のすべての要素に作用するループに変更したいと思うでしょう。上記のコードは "series"配列の最初の要素と一緒に動作します。

あなたは、その後の測定をループすることができます

for (Measurement m : measurements.data) { 
    System.out.println("Time: " + m.time + " Pm: " + m.pm); 
} 

あなたがこれを支援するためにtoString()を使用することができます。

static class Measurement { 
    int time; 
    double pm; 
    public String toString() { 
    return "Time: " + time + " Pm: " + pm; 
    } 
} 

これは、あなたがこれまであなたのループを簡素化することができます:

for (Measurement m : measurements.data) System.out.println(m); 
+0

' getメソッドを解決できません 'get(java.lang.String)' 'at' get(0).data [0] .toString() " – Defozo

+0

ありがとうございますが、私は別のエラーがあります:' IllegalStateException:BEGIN_OBJECTは期待されましたがBEGIN_ARRAY'でした。Measurements = gson.fromJson(responseWrapper、Measurements.class); – Defozo

+0

残念ながら、エラーは同じです。 – Defozo

関連する問題