3

GSON ライブラリを使用したデシリアライゼーションの問題があります。

以下は、逆シリアル化しようとする JSON コードです。

{"response": {
  "@service": "CreateUser",
  "@response-code": "100",
  "@timestamp": "2010-11-27T15:52:43-08:00",
  "@version": "1.0",
  "error-message": "",
  "responseData": {
    "user-guid": "023804207971199"
  }
}}

次のクラスを作成します

public class GsonContainer {

        private GsonResponse mResponse;

        public GsonContainer() { }

        //get & set methods

}

public class GsonResponse {

    private String mService;
    private String mResponseCode;
    private String mTimeStamp;
    private String mVersion;
    private String mErrorMessage;

    private GsonResponseCreateUser mResponseData;

    public GsonResponse(){

    }

    //gets and sets method
}

public class GsonResponseCreateUser {

    private String mUserGuid;

    public GsonResponseCreateUser(){

    }

    //get and set methods
}

GSON ライブラリを呼び出した後、データは null です。クラスの何が問題なのですか?

あなたの助けのために事前にThx ...私はそれが些細なことだと思います....

4

2 に答える 2

11

@ user523392 は言いました:

メンバー変数は、JSON 応答で指定されたものと正確に一致する必要があります

これはそうではありません。

Java フィールド名を JSON 要素名にマップする方法を指定するためのオプションがいくつかあります。

上記の元の質問の場合に有効な解決策の 1 つは、Java クラス メンバーに@SerializedNameのアノテーションを付けて、マッピング先の JSON 要素名を非常に明示的に宣言することです。

// output: [MyObject: element=value1, elementTwo=value2]

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;

public class Foo
{
  static String jsonInput =
      "{" +
          "\"element\":\"value1\"," +
          "\"@element-two\":\"value2\"" +
      "}";

  public static void main(String[] args)
  {
    GsonBuilder gsonBuilder = new GsonBuilder();
    Gson gson = gsonBuilder.create();
    MyObject object = gson.fromJson(jsonInput, MyObject.class);
    System.out.println(object);
  }
}

class MyObject
{
  String element;

  @SerializedName("@element-two")
  String elementTwo;

  @Override
  public String toString()
  {
    return String.format(
        "[MyObject: element=%s, elementTwo=%s]",
        element, elementTwo);
  }
}

もう 1 つの方法は、FieldNamingStrategyJava メンバー名を JSON 要素名に変換する方法を指定するカスタムを作成することです。この例では、すべての Java メンバー名に同じ名前マッピングを適用します。すべての JSON 要素名が同じ命名パターンに従っているわけではないため、このアプローチは上記の元の例では機能しません。すべてが「@」で始まるわけではなく、名前部分を「-」で区切る代わりにキャメル ケースの命名を使用するものもあります。 '。このインスタンスは、インスタンス ( )FieldNamingStrategyを構築するときに使用されます。GsongsonBuilder.setFieldNamingStrategy(new MyFieldNamingStrategy());

class MyFieldNamingStrategy implements FieldNamingStrategy
{
  // Translates the field name into its JSON field name representation.
  @Override
  public String translateName(Field field)
  {
    String name = field.getName();
    StringBuilder translation = new StringBuilder();
    translation.append('@');
    for (int i = 0, length = name.length(); i < length; i++)
    {
      char c = name.charAt(i);
      if (Character.isUpperCase(c))
      {
        translation.append('-');
        c = Character.toLowerCase(c);
      }
      translation.append(c);
    }
    return translation.toString();
  }
}

Java フィールド名を JSON 要素名にマップする方法を管理するもう 1 つの方法は、インスタンスのFieldNamingPolicy構築時に を指定することです。ただし、これも元の例では機能しません。同じ名前マッピング ポリシーがすべての状況に適用されるためです。GsongsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);

于 2011-06-06T22:27:22.097 に答える
0

上記の JSON 応答は、特殊文字 @ と - のため、GSON でデシリアライズできません。GSON はリフレクションに基づいており、メンバー変数は JSON 応答で指定されたものと正確に一致する必要があります。

于 2010-12-01T07:26:21.650 に答える