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 库后,数据为空。有什么想法有什么问题吗?

提前感谢您的帮助......我认为这是微不足道的......

4

2 回答 2

11

@user523392 说:

成员变量必须与 JSON 响应中给出的完全匹配

不是这种情况。

有几个选项可用于指定 Java 字段名称如何映射到 JSON 元素名称。

适用于上述原始问题的一种解决方案是使用@SerializedName注释 Java 类成员,以非常明确地声明它映射到的 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);
  }
}

另一种方法是创建一个自定义FieldNamingStrategy来指定如何将 Java 成员名称转换为 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 元素名称的另一种方法是FieldNamingPolicy在构建Gson实例时指定 a,例如gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);. 但是,这也不适用于原始示例,因为它将相同的名称映射策略应用于所有情况。

于 2011-06-06T22:27:22.097 回答
0

由于特殊字符 @ 和 -,上述 JSON 响应无法被 GSON 反序列化。GSON 基于反射,并且成员变量必须与 JSON 响应中给出的完全匹配。

于 2010-12-01T07:26:21.650 回答