使用jackson @JsonDeserialize @JsonCreator将JSON解析为POJO

时间:2017-09-13 10:59:03

标签: android parsing jackson retrofit

有一个例子json响应,即

{
    "id" : 1,
    "name" : "test_name",
    "email" : "test@test.com"
}

理想情况下,使用Jackson进行此响应的POJO应该是这样的

class User {

    String id;
    String name;
    String email;

    // getter setter
}

但是我希望在POJO这样的

中解析这个响应
class User {

    IdName idName;
    String email;

    // getter setter
}

其中IdName是:

class IdName {

    String id;
    String name;

    // getter setter
}

POJO的结构无法改变,所以想通过Jackson注释实现这一目标

5 个答案:

答案 0 :(得分:0)

POJO的标准实现是私有地使用该对象的所有属性,并使用构造函数初始化它们,然后使用getter和setter。

大多数开源库都是为了从这种格式返回数据而设计的。如果你想改变它,那就创建一个新类并从那里调整对象。

答案 1 :(得分:0)

你可以使用Gson。使用Gson,您可以将JSON转换为Object,反之亦然。以下是一个示例:

从JSON到对象:

Gson gson = new Gson();
MyObject myObject = gson.fromJson(myJson, MyObject.class);

从对象到JSON:

Gson gson = new Gson();
String jsonStr = gson.toJson(myObject);

答案 2 :(得分:0)

如果您的JSON字符串如下所示,那么您可以获得预期的POJO

{
    "IdName":{ "id" : 1,
    "name" : "test_name"},
    "email" : "test@test.com"
}

答案 3 :(得分:0)

两种方式:

  1. 修改您的json响应,请您的后端开发人员这样做。

    {
    "IdName":
    {"id" : 1,
    "name" : "test_name"
    },
    "email" : "test@test.com"
     }
    
    1. 手动创建IdName pojo,为id&分配值名字然后改变pojo。

      IdName idName = new IdName(id,name)

      user.idName = idName

答案 4 :(得分:0)

我只是通过Gson工作。 Gson提供了一个接口 JsonDeserializer ,通过它我们可以为我们想要的任何类提供自己的自定义反序列化逻辑。

具体到我下面提到的案例是:

class User {

    @Expose
    IdName idName;
    @Expose
    String email;

    // getter setter
}

其中IdName是:

class IdName {

    @Expose
    String id;
    @Expose
    String name;

    // getter setter
}

自定义反序列表 -

public class TempDeserializer implements JsonDeserializer<User> {

@Override
public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    JsonObject jsonObject = json.getAsJsonObject();

    int id = jsonObject.get("id").getAsInt();
    String name = jsonObject.get("name").getAsString();

    IdName idName = new IdName(id, name);

    User user = new User();
    user.setEmail(jsonObject.get("email").getAsString());
    user.setIdName(idName);
    return user;
}
}

现在将返回一个User对象,其中IdName对象是从响应值设置的。