从子对象映射json字段

时间:2017-04-07 11:29:04

标签: java json spring jackson gson

以下是将Json字符串转换为json的问题说明。

Address{
    private long id;
    private String city;
}

Employee{
    private long id;
    private String name;
    private Address address;
}

客户将使用员工的JSON发送请求

{"id": 1, "name": "ABC", "address": {"id": 1, "city": "XYZ"}}

现在我想将输入json转换为以下格式,其中addressId = Address类的id字段。

Output{
    private long id;
    private String name;
    private long addressId; 
}

有没有办法实现这一目标。 我也尝试过Jackson和Gson。

2 个答案:

答案 0 :(得分:1)

使用Jackson,您可以添加class AddressId以仅使用id字段和带有AddressId作为参数的带注释的构造函数来包装地址。根据需要添加getter和其他构造函数。这不需要仅定义EmployeeAddressOutput

class Output {
    private long id;
    private String name;
    private long addressId;

    @JsonCreator
    public Output(
            @JsonProperty("id") long id,
            @JsonProperty("name") String name,
            @JsonProperty("address") AddressId address) {
        this.id = id;
        this.name = name;
        this.addressId = address.getId();
    }
}

class AddressId {
    private long id;
}

在这种情况下,您还需要配置ObjectMapper以静默忽略未知的JSON字段:

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

另一个不需要class AddressId的替代方案是根据杰塞逊在反序列化时内部使用的addressIdMap<String, Object>字段创建自定义设置器。这就是Output在这种情况下的样子(添加您可能需要的其他setter / getter):

class Output {
    private long id;
    private String name;

    @JsonProperty("address")
    public void setAddressId(final Map<String, Object> address) {
        addressId = (Integer) address.get("id");
    }

    private long addressId;
}

答案 1 :(得分:-1)

您可以使用Gson api从json转换对象。

与以下代码类似。不确定它是否没有语法错误。但是,这是可能的。

Gson gson = new Gson();
Employee emp = gson.fromJson("{"id": 1, "name": "ABC", "address": {"id": 1, "city": "XYZ"}}", 
    Employee.class);

如果上述代码无效,请尝试使用dozer