我正在使用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库后,数据为空。任何想法课程有什么问题?
提前帮助你...我认为这是微不足道的......
答案 0 :(得分: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
实例(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);
。但是,这也不适用于原始示例,因为它将相同的名称映射策略应用于所有情况。
答案 1 :(得分:0)
由于特殊字符@和 - ,GSON无法对上面的JSON响应进行反序列化。 GSON基于反射,成员变量必须与JSON响应中给出的内容完全匹配。