假设有一个像这样的JSON
{
"data" : {
"messages" : {
"count" : 2,
"data" : [
"message 1",
"message 2"
]
},
"user" : {
"f_name" : "Mark",
"l_name" : "lewis"
},
"city" : "London",
"address" : "221b Baker Street, London"
}
}
我能用GSON实现这样的目标吗?
public class JSData {
public String city;
public String address;
public Array messages;
@SerializedName("user.f_name")
public String firstName;
@SerializedName("user.l_name")
public String lastName;
}
我想直接访问user.f_name
,因此我不必为user
创建包装,并可以使用
JSData topic = gson.fromJson(jsonObj, JSData.class);
答案 0 :(得分:0)
我认为你应该像这样创建一个类用户
public class User {
@SerializedName("f_name")
public String firstName;
@SerializedName("l_name")
public String lastName;
}
public class JSData {
public String city;
public String address;
public Array messages;
@SerializedName("user")
public User user;
}
答案 1 :(得分:-1)
我不知道如何以@SerializedName("user.f_name")
方式归档,如何
但由于JsonDeserializer
,可以将内部字段展平。
假设我们有
{
"publishDate": {
__type: "Date",
iso: "2014-11-05T02:27:00.000Z"
},
...
}
我们希望将内部“iso”字段转换为上部“publishDate”为Date
。
所以,JsData类看起来像这样。
public class JsData {
// publishDate is JSONObject. but get it as Date!
public Date publishDate;
...
}
实现JsonDeserializer<Date>
并注册到gson以存档自定义反序列化。当gson检测到Date
字段时,将调用此实现。
public static class PublishDateDeserializer implements JsonDeserializer<Date> {
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
// this deserializer is only for "publishDate"
// real json is jsonobject. get inner "iso"
String iso = json.getAsJsonObject().get("iso").getAsString();
DateFormat parser = new SimpleDateFormat(DATE_JSON_PATTERN);
try {
return parser.parse(iso);
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
}
然后通过构建器注册
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new PublishDateDeserializer()).create();
gson.fromJson(json, JsData.class);
我希望它会有所帮助。