2011-06-19 5 views
3

GSonを使ったjsonの逆シリアル化ではいくつかの困難があります。誰かが私を助けてくれることを願っています。私は、次のJSONをデシリアライズしたいGsonを使ったジェネリックコレクションの非直列化

スニペット:

{ 
    "fieldA": "valueA", 
    "myCollection": { 
     "AnotherClass": [ 
      { 
       "objectAfieldA": "valueB", 
       "objectAfieldB": "valueC" 
      }, 
      { 
       "objectAfieldA": "valueD", 
       "objectAfieldB": "valueE" 
      } 
     ] 
    } 
} 

対応する総合的なクラスがある次のフィールド:今

... 
String fieldA; 
List<AnotherClass> = new ArrayList<AnotherClass>(); 
.... 

を、私の問題は、私は逆シリアル化するとき、なし、fromJson(jsonSample, resultContainer.class)を使用していることですList<T>要素はすべて問題ありませんが、含まれているリストを含めるとNullPointerExceptionと表示されます。私は、ジェネリック型のコレクションと、TypeTokenの使用を扱う方法についてお読みになりましたが、私のコレクションが別のクラスの一部である場合、この知識を適用することはできません...

本当にありがとうございます。

+0

あなたの仕事からあなたのコードの例を取っ​​た場合は、リストのフィールドに名前がないとして、それがコンパイルされません。それが問題でない場合は、[http://stackoverflow.com/questions/5554217/google-gson-deserialize-listclass-object-generic-type](http://stackoverflow.com/questions)をご覧ください。/5554217/google-gson-deserialize-listclass-object-generic-type)、[http://stackoverflow.com/questions/2496494/library-to-encode-decode-from-json-to-java-util-マップ](http://stackoverflow.com/questions/2496494/library-to-encode-decode-from-json-to-java-util-map) – oberger

+0

あなたは正しいです、私は名前フィールドが欠けていました。そして、この問題は次の答えで解決されます。 –

答えて

1

デシリアライズ時に、逆シリアル化される最も外側の構造体が汎用コレクションである場合は、TypeTokenを使用する必要があります。これは元の質問の例では当てはまりません。したがって、TypeTokenの使用は不要です。

問題は、JSON構造がバインドしようとしているJava構造と一致しないことが原因と考えられます。

JSON構造はと一致するようにJavaデータ構造を定義し、そう

an object with two elements 
    element 1 is a string named "fieldA", 
    element 2 is an object named "myCollection", which has one element 
     the one element is an array named "AnotherClass", composed of objects with two elements 
      element 1 is a string named "objectAfieldA", 
      element 2 is a string named "objectAfieldB" 

を定義し、直列化復元が必要な任意のカスタム処理せずに、非常に簡単に動作します。このような一致するJava構造が提供されない場合は、カスタムの直列化が必要です。

元の質問の名前と種類を使用したこのような実例があります。

import java.io.FileReader; 

import com.google.gson.Gson; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    resultContainer result = gson.fromJson(new FileReader("input.json"), resultContainer.class); 
    System.out.println(gson.toJson(result)); 
    } 
} 

class resultContainer 
{ 
    String fieldA; 
    MyCollectionContainer myCollection; 
} 

class MyCollectionContainer 
{ 
    SomeOtherClass[] AnotherClass; 
} 

class SomeOtherClass 
{ 
    String objectAfieldA; 
    String objectAfieldB; 
} 
+0

偉大な答え、スポット!私は私のJava構造を調整し、私は再び幸せです。サンクス、ブルース。 –

+0

別の問題が発生しました...私が使用しているサービスでは、 'AnotherClass'要素の中に1つの項目しか入っていない場合があります.Json配列(SomeOtherClass [])に完全にキャストされていません。 type - 配列の括弧を残します。それは私の脱直列化を破ります。角括弧を手動で追加すると、再度解析されます。このJSON標準ですか、あなたは回避策がありますか? –

+0

あなたが説明したことは、あまりに頻繁に発生する問題です。おそらく、生成するJSONが有効であれば、一貫して構造化されていなくても十分だと考える人がいるかもしれません。 Gsonは残念なことに、このような頻繁に発生する問題を処理するためのシンプルな設定はまだありません。カスタムデシリアライズ処理が必要です。私はhttp://stackoverflow.com/questions/6223023の質問に答えてそのような例を掲示しました。 –

4

無名のJSON配列をdeserealizingためのソリューションは非常に簡単です:

List<resultContainer> lres = gson.fromJson(new FileReader("input.json"), new TypeToken<List<resultContainer>>(){}.getType()); 
関連する問題