23

要するに、これは Java で解析したい JSON オブジェクトのスケッチです。

{
    object1: {
            item1: //[String | Array | Object] ,
            item2: // ...
            //<> more items
    object2: { /* .. */ }
    //<> more objects
}

これらは、解析用に作成したPOJOimportです (簡潔にするためにステートメントは省略します)。

(1) 完全な JSON オブジェクトの表現

public class JObjectContainer {

    private List<JObject> jObjects ;

    public JObjectContainer() { }

    //get & set methods

}

(2) ネストされたオブジェクトの表現:

 public class JObject {

    private String id ;
    private List<JNode> jObjects ;

    public JObject() { } 

    //get & set methods

}

(3) アイテムの表現:

 public class JNode {

    private JsonElement item1 ;
    private JsonElement item2 ;
    //<> more item fields

    public JNode() { }

    //get & set methods

}

ここで、Gson インスタンスを作成して (FileReaderをインポートするためjsonFile)、

 Gson gson = new Gson() ;
 JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ;

NullPointerException解析可能なオブジェクトにアクセスしようとするたびに (たとえば、 a を介して) を取得しますListIterator。ただし、 Gson指定したクラスのオブジェクトを作成し、その後のエラーはスローしません。

私はこれが以前に行われたことを知っています。それで、私は何が欠けていますか?

ティア

4

2 に答える 2

38

それは可能ではありません。object1object2などを配列の項目として表すようにJSON構造を変更する必要があります。現在、それらはオブジェクトのプロパティであり、それらの数が明らかに不明です(そうでない場合は、としてマップしようとしませんでしたList)。Gsonは賢いですが、それほど賢くはありませ:)

したがって、基本的な例として、配列を使用したこのJSON構造は次のとおりです。

{ nodes:
  [
    { item1: 'value1a', item2: 'value2a' },
    { item1: 'value1b', item2: 'value2b' },
    { item1: 'value1c', item2: 'value2c' }
  ]
}

Java表現(必ずしもPOJOと呼ばれる必要はありませんが、javabeanまたはモデルオブジェクトまたは値オブジェクトと呼ばれる必要があります)との組み合わせ。

public class Container {
    private List<Node> nodes;
    // +getter.
}

public class Node {
    private String item1;
    private String item2;
    // +getters.
}

そしてこのGsonの呼び出し

Container container = new Gson().fromJson(json, Container.class);

動作するはずです。

更新:明確にするために、JSON構造が問題であり、Javaオブジェクト構造ではありません。Javaオブジェクト構造が最終的に完成させたいものとまったく同じであるとすると、Gsonにその仕事をさせるには、JSON構造は次のようになります。

{ jObjects:
  [
    { id: 123, jObjects: 
      [
        { item1: 'value1a', item2: 'value2a' },
        { item1: 'value1b', item2: 'value2b' },
        { item1: 'value1c', item2: 'value2c' }
        /* etc... commaseparated */
      ]
    },
    { id: 456, jObjects: 
      [
        { item1: 'value1d', item2: 'value2d' },
        { item1: 'value1e', item2: 'value2e' },
        { item1: 'value1f', item2: 'value2f' }
        /* etc... commaseparated */
      ]
    }
    /* etc... commaseparated */
  ]
}

プロパティは無効であるため、プロパティのみを。JsonElementに置き換える必要がありStringます。

于 2010-05-19T12:48:58.360 に答える
0

BalusC は、GSon (および一般的には 1 対 1 のデータ バインディング) に関する特定の質問に対して適切な指針を示したと思います。ただし、より動的な処理が必要だと思われる場合に備えて、他の JSON 処理パッケージを検討することもできます。多くのパッケージには、物事をマッピングするための追加または代替の方法があります。Json-lib、flexjson、および Jackson には、少なくとも Gson と比較して追加機能があります。より緩いマッピングを提供するもの (ものの名前を型に定義する) もあれば、多形型を実際にサポートするものもあります (オブジェクトを宣言しますが、実際にはシリアル化されたサブタイプにマップできます)。

于 2010-08-21T16:46:08.007 に答える