MappingFacebook对POJO的JSON响应

时间:2016-10-19 10:32:24

标签: android json gson

我正在对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对象中:picturedata。我想一个可能的解决方案,但不是最好的解决方案是在Facebook模型中创建Picture对象,然后在Data对象中创建Picture对象,但感觉不好创建另外两个pojos串。还有其他解决方案吗?

1 个答案:

答案 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());

}