【问题标题】:Map json field from child object从子对象映射 json 字段
【发布时间】:2017-04-07 11:29:04
【问题描述】:

这里是关于将 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。

【问题讨论】:

  • 为什么不 JSON.Parse 整个对象然后选择孩子
  • 我想最好的方法是编写一个自定义的杰克逊反序列化器

标签: java json spring jackson gson


【解决方案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 的替代方法是根据Jackson 在反序列化时在内部使用的Map<String, Object>addressId 字段创建自定义设置器。这就是 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;
}

【讨论】:

  • 我不想创建单独的类“AddressId”
  • 不,接收方没有班级地址
  • 恐怕您必须在某处编写一些代码才能将 idaddress 映射到 addressId 字段。没有图书馆可以自己做到这一点。我将提供另一个不需要定义类的替代方案。
【解决方案2】:

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

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

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

如果上面的代码不行,试试dozer

【讨论】:

  • 我想把给定的json转换成Output类的形式。
  • 输出类的形式是什么意思?您可以在转换后获取 Employee 对象。在你想要的地方使用它......
猜你喜欢
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 2020-04-17
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多