2010-11-29 7 views
2

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

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

ответ

0

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

+4

Это неправда. – 2011-06-06 22:27:52

9

@ 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);. Однако это также не будет работать с исходным примером, поскольку он применяет политику сопоставления имен для всех ситуаций.

Смежные вопросы