2010-11-29 146 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元素名称。

上述原始问题的一种解决方案是使用@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元素名称都遵循相同的命名模式 - 它们并不全部以“@”开头,有些使用骆驼命名而不是将名称部分与' ”。在构建Gson实例(gsonBuilder.setFieldNamingStrategy(new MyFieldNamingStrategy());)时,将使用此实例FieldNamingStrategy

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元素名称是建设时Gson实例,例如,gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES);指定FieldNamingPolicy。但是,这也不适用于原始示例,因为它将相同的名称映射策略应用于所有情况。