我正在对Facebook进行API调用并接收以下Json对象:
{"first_name":"FirstName",
"last_name":"LastName",
"email":"email@email.com",
"picture":{"data":{"is_silhouette":true,"url":"pictureUrl"}},"id":"12345"}
我没有手动反序列化对象,而是正在使用Gson
,如下所示:
FacebookProfileModel facebookProfileModel = new Gson().fromJson(object.toString(), FacebookProfileModel.class);
这是我的POJO的样子:
@SerializedName("first_name")
String mFirstName;
@SerializedName("last_name")
String mLastName;
@SerializedName("email")
String mEmail;
@SerializedName("url")
String mUrl;
显然,我收到除url之外的所有值,因为值在2个Json对象中:picture
和data
。我想一个可能的解决方案,但不是最好的解决方案是在Facebook模型中创建Picture
对象,然后在Data
对象中创建Picture
对象,但感觉不好创建另外两个pojos串。还有其他解决方案吗?
答案 0 :(得分:1)
此处没有基于注释的解决方案。但是,自定义反序列化器可以解决此问题。
自定义反序列化器: -
public class FacebookProfileModelDeserializer implements JsonDeserializer<FacebookProfileModel> {
@Override
public FacebookProfileModel deserialize(JsonElement paramJsonElement, Type paramType,
JsonDeserializationContext paramJsonDeserializationContext) throws JsonParseException {
String url = paramJsonElement.getAsJsonObject().get("picture").getAsJsonObject().get("data").getAsJsonObject()
.get("url").getAsString();
FacebookProfileModel facebookProfileModel = new Gson().fromJson(paramJsonElement.getAsJsonObject(),
FacebookProfileModel.class);
facebookProfileModel.setmUrl(url);
return facebookProfileModel;
}
}
主要方法: -
public static void main(String[] args) {
String jsonString = "{\"first_name\":\"FirstName\",\"last_name\":\"LastName\",\"email\":\"email@email.com\",\"picture\":{\"data\":{\"is_silhouette\":true,\"url\":\"pictureUrl\"}},\"id\":\"12345\"}";
Gson gson = new GsonBuilder()
.registerTypeAdapter(FacebookProfileModel.class, new FacebookProfileModelDeserializer())
.create();
FacebookProfileModel faceBookProfileModel = gson.fromJson(jsonString, FacebookProfileModel.class);
System.out.println(faceBookProfileModel.toString());
}