Проблема десериализации GSON - PullRequest
3 голосов
/ 29 ноября 2010

У меня проблема десериализации с использованием библиотеки 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 данные становятся нулевыми.Любые идеи, что не так с классами?

Спасибо заранее за вашу помощь ... Я предполагаю, что это что-то тривиальное ....

Ответы [ 2 ]

11 голосов
/ 07 июня 2011

@ user523392 сказал:

переменные-члены должны точно соответствовать тому, что указано в ответе JSON

Это не так.

Есть несколько опций для указания того, как имена полей Java отображаются на имена элементов JSON.

Одно решение, которое будет работать для случая в исходном вопросе выше, состоит в том, чтобы аннотировать членов класса 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);
  }
}

Другой подход заключается в создании пользовательского FieldNamingStrategy для указания того, как имена элементов Java преобразуются в имена элементов JSON.В этом примере будет применяться одно и то же сопоставление имен для всех имен членов Java.Этот подход не будет работать для приведенного выше исходного примера, потому что не все имена элементов JSON следуют одному и тому же шаблону именования - они не все начинаются с '@', и некоторые используют именование в случае верблюда вместо разделения частей имени с '-».Экземпляр этого FieldNamingStrategy будет использоваться при создании экземпляра Gson (gsonBuilder.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, например, gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);.Однако это также не будет работать с исходным примером, поскольку оно применяет одну и ту же политику сопоставления имен для всех ситуаций.

0 голосов
/ 01 декабря 2010

GSON не может десериализовать приведенный выше ответ JSON из-за специальных символов @ и -. GSON основан на отражениях, и переменные-члены должны точно соответствовать тому, что указано в ответе JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...