73

Gsonを使用して、Webサービスから返されたjson文字列を逆シリアル化しようとしています

構造はとして返されTypeDTO[]ます。

どこTypeDTOのような

int id;
String name;
ArrayList<ItemDTO> items[] 

ItemDTOは

int id;
String name;
Boolean valid;

次のようにコードを呼び出すと

Gson gson = new Gson();
TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class);

オブジェクト内のすべてがnullです

ただし、使用する場合

JSONArrayJSONObjectorg.json jarから1つずつ引き出すには、正常に機能し、それに応じてフィールドにデータが入力されます。

私が間違っていることについて何か考えはありますか?Gsonは非常に高速ですか?それとも、私はすでに働いているものに固執する方が良いですか?

ありがとう、デビッド

4

2 に答える 2

132

元の質問の Java データ構造の例は、コメントの JSON 構造の説明と一致しません。

JSON は次のように記述されます。

「{object}} の配列を持つ {object の配列」。

質問で説明されている型に関して、JSON 構造に一致する Java データ構造に変換された JSON は、Gson で簡単に逆シリアル化できます。

「{ItemDTOオブジェクト}}の配列を持つ{TypeDTOオブジェクトの配列」。

しかし、質問で提供された Java データ構造はこれではありません。代わりに

「{ItemDTOオブジェクト}}の配列の配列を持つ{TypeDTOオブジェクトの配列」。

2 次元配列 != 1 次元配列。

この最初の例は、Gson を使用して、「{object}} の配列を持つ {object の配列」である JSON 構造を単純に逆シリアル化およびシリアル化する方法を示しています。

input.json 内容:

[
  {
    "id":1,
    "name":"name1",
    "items":
    [
      {"id":2,"name":"name2","valid":true},
      {"id":3,"name":"name3","valid":false},
      {"id":4,"name":"name4","valid":true}
    ]
  },
  {
    "id":5,
    "name":"name5",
    "items":
    [
      {"id":6,"name":"name6","valid":true},
      {"id":7,"name":"name7","valid":false}
    ]
  },
  {
    "id":8,
    "name":"name8",
    "items":
    [
      {"id":9,"name":"name9","valid":true},
      {"id":10,"name":"name10","valid":false},
      {"id":11,"name":"name11","valid":false},
      {"id":12,"name":"name12","valid":true}
    ]
  }
]

Foo.java:

import java.io.FileReader;
import java.util.ArrayList;

import com.google.gson.Gson;

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

class TypeDTO
{
  int id;
  String name;
  ArrayList<ItemDTO> items;
}

class ItemDTO
{
  int id;
  String name;
  Boolean valid;
}

この 2 番目の例では、実際には「{ItemDTO オブジェクト}} の配列の配列を持つ {TypeDTO オブジェクトの配列」である JSON 構造を代わりに使用して、最初に提供された Java データ構造と一致させます。

input.json 内容:

[
  {
    "id":1,
    "name":"name1",
    "items":
    [
      [
        {"id":2,"name":"name2","valid":true},
        {"id":3,"name":"name3","valid":false}
      ],
      [
        {"id":4,"name":"name4","valid":true}
      ]
    ]
  },
  {
    "id":5,
    "name":"name5",
    "items":
    [
      [
        {"id":6,"name":"name6","valid":true}
      ],
      [
        {"id":7,"name":"name7","valid":false}
      ]
    ]
  },
  {
    "id":8,
    "name":"name8",
    "items":
    [
      [
        {"id":9,"name":"name9","valid":true},
        {"id":10,"name":"name10","valid":false}
      ],
      [
        {"id":11,"name":"name11","valid":false},
        {"id":12,"name":"name12","valid":true}
      ]
    ]
  }
]

Foo.java:

import java.io.FileReader;
import java.util.ArrayList;

import com.google.gson.Gson;

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

class TypeDTO
{
  int id;
  String name;
  ArrayList<ItemDTO> items[];
}

class ItemDTO
{
  int id;
  String name;
  Boolean valid;
}

残りの2つの質問について:

Gsonは非常に高速ですか?

他の逆シリアル化/シリアル化 API とは比較されません。Gson は伝統的最も遅い. Gson の現在および次のリリースには、大幅なパフォーマンスの改善が含まれていると報告されていますが、その主張を裏付ける最新のパフォーマンス テスト データは探していません。

とはいえ、Gson が必要に応じて十分に高速である場合は、JSON のデシリアライズが非常に簡単になるため、Gson を使用することはおそらく理にかなっています。より優れたパフォーマンスが必要な場合は、Jackson を使用することをお勧めします。Gson の利便性の多く (場合によってはすべて) を提供します。

それとも、すでに取り組んでいるものに固執する方がよいでしょうか?

私はしません。ほとんどの場合、次のような単純な 1 行のコードを使用します。

TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);

...一度に 1 つのコンポーネントを一緒にマップするために必要な 30 行のコードよりも、複雑なデータ構造に簡単にデシリアライズすることができます。

于 2011-06-09T22:58:18.820 に答える