2013-05-23 27 views
7

jsonをjavaに解析しようとしています。JSON GSONを使用したJavaオブジェクトへの文字列

私は、オブジェクトにそれを解析しようとしていますし、私は次のエラーを取得するjsonlint.com

private final static String LOC_JSON = 
     "[" 
     +"{" 
     +" \"lat1\": 39.737567," 
     +" \"lat2\": 32.7801399," 
     +" \"long1\": -104.98471790000002," 
     +" \"long2\": -96.80045109999998" 
     +"}," 
     +" [" 
     +"  {" 
     +"   \"lat\": {" 
     +"    \"b\": 38.88368709500021," 
     +"    \"d\": 40.620468491667026" 
     +"   }," 
     +"   \"long\": {" 
     +"   \"b\": -105.75306170749764," 
     +"   \"d\": -104.675854661387" 
     +"   }" 
     +"  }" 
     +" ]" 
     +"]"; 

に応じて有効なJSONで次の文字列を持っています。 は "BEGIN_OBJECT期待が、行1、列2でBEGIN_ARRAYだった"

  Gson gson = new Gson(); 
     BoxSearch b = gson.fromJson(LOC_JSON, BoxSearch.class); 

BoxSearchは、この構成されています。

private Number lat1; 
private Number lat2; 
private Number long1; 
private Number long2; 
private Boxes[] boxes; 

ボックスは、LatitudeオブジェクトとLongitudeオブジェクトの両方が同一に定義されています。

private String b; 
private String d; 

私はそれら4つの属性を有するより単純なBoxSearchオブジェクトに(LAT1、LAT2、long1及びlong2)より高いレベルの属性を解析することができます。問題は、jsonとオブジェクトがより複雑な場合に発生します。私がしようとしていることをすることさえ可能ですか?

私はいくつかの助けを得るのに十分な情報を提供していただきたいと思います。必要に応じて、より多くの情報やテストプロジェクトを提供することができれば幸いです。私はこれをjunitテストとして実行しています。

ありがとうございました。

+3

[GSON throwing "Expected BEGIN \ _OBJECT、BEGIN \ _ARRAY"の可能な複製?](http://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin -array) - JSONはオブジェクトではなく配列です。カスタムデシリアライザを書かずに扱うことのできないさまざまな種類のオブジェクト(オブジェクトと配列)を含む配列であるため、問題が生じるでしょう。 –

+0

@BrianRoachこれは答えと同じです;) –

+0

@RC。うん...うーん。私はおそらく私はそれを移動すると思う、古いQは、彼がエラーを取得している理由を答えるが、彼のケースへの解決は異なる –

答えて

16

エラーの原因は、最上位のJSONがオブジェクトではなく配列であることです。それはGSON throwing "Expected BEGIN_OBJECT but was BEGIN_ARRAY"?によってカバーされています。

しかし、単一のタイプのオブジェクトの配列ではなく、混合型(オブジェクトと配列)の配列があるため、このソリューションはJSONでは機能しません。そのためには、カスタムデシリアライザ(The section of the Gson user's guide that covers thisを参照)を作成するか、GsonのJsonParserクラスを直接使用して解析ツリーからデータを抽出する必要があります。

上記のコメントから編集:

あなたはJSONを作成する1なら何をしたいことはBoxSearchオブジェクトの配列であるように、それに見えますか?

あなたのJava BoxSearchクラスに基づいて、あなたは次のように構造化JSONを必要とするだろう:

[ 
    { 
     "lat1" : 39.737567, 
     "lat2" : 32.7801399, 
     "long1" : -104.98471790000002, 
     "long2" : -96.80045109999998, 
     "boxes" : [ 
        { 
         "lat": { 
          "b": 38.88368709500021, 
          "d": 40.620468491667026 
         }, 
         "long": { 
          "b": -105.75306170749764, 
          "d": -104.675854661387 
         } 
        } 
        ] 
    } 
] 

しかし、あなたが定義したBoxesクラスを持っている方法は、そのために動作しません。 (あなたはそれらの配列を持っていることを意味しましたか?)。ある-として、それがどのように見える必要があるでしょう:あなたが本当に必要としない場合は

Type collectionType = new TypeToken<Collection<BoxSearch>>(){}.getType(); 
Collection<BoxSearch> boxSearchCollection = gson.fromJson(json, collectionType); 

:今、あなたはあなたとデシリアライズできたオブジェクトの1種類(BoxSearch)を含む配列を持っている

class Boxes { 
    Box lat; 
    @SerializedName("long") 
    Box lon; 
} 

class Box { 
    String b; 
    String d; 
} 

これらの配列は、外側の配列を取り除くと、単純に実行します。非常に簡単

gson.fromJson(json, BoxSearch.class); 
+0

ブライアンさん、本当にありがとうございます。私はこの答えを投票するだろうが、私は "街の信用"を持っていない。コードはチャンピオンのように機能します。人々がこの答えをコピーして貼り付ける場合は、Box longです。名前を変更する必要があります:-) – user2415153

+0

ああ、はい、私は配列が必要です。再度、感謝します。 – user2415153

+0

@ user2415153 JSONの '' long "'で動作するようにコードを変更しました - 答えを見てください:)私はそれを気付かなかった、ごめんなさい。 upvotingに関して - あなたは私の答えを受け入れることができます;)そして私が助けることができてうれしい! –

13
Gson gson = new Gson(); 
gson.fromJson(jsonStr,YourClass.class); 

を。

+0

これは、内部にリストを持つjsonオブジェクトを変換するのに役立ちます。 jsonの文字列をObject.classに変換する – Ashkan

関連する問題