【问题标题】:Using JAVA Reflection how to create custom JSON object mapping使用 JAVA 反射如何创建自定义 JSON 对象映射
【发布时间】:2021-09-13 14:16:54
【问题描述】:

我有一个如下格式的 json 对象,我需要将 Json 中的值分配给 java 对象,但是 JSON 和类中的标签名称不同。

{
  FirstName: "Sample",
  LastName: "LName",
  Address: [
    {
      type: "Temp",
      street: "test stree",
      
    },
    {
      type: "Perm",
      street: "test stree",
      
    }
  ]
}

Class Parent{

private String Name1;
private String Nama2;
private List<Address> address;}

Class Address{

Private String type;

private String data;
}

我想使用 Java 反射来实现自定义对象映射器。映射如下,但我不知道如何实现这个,任何有价值的建议或外部 api 的使用都会帮助我实现这个场景。

Json 对象名称 Jave 类对象名称 名字 ---------- Name1 姓 ---------- 姓名2
Address.type -------- 地址类类型 Address.street ----- 地址类数据

【问题讨论】:

  • 这里为什么要使用反射?为什么不提供一个自定义的反序列化器,或者通过 Jackson 的注解或 mixins 将映射添加到 Parent 和 Address?
  • 嗨,Thomas,请让我知道如何在此处使用自定义反序列化器,尽管使用反射我们需要在运行时获取字段并将值设置为类,因为我们正在使用它种映射的第一次..
  • 好吧,你可以看看这里:baeldung.com/jackson-deserialization 但是,类本身的 @JsonProperty 注释或它们的 mixins 可能是更简单的选择。

标签: java reflection objectmapper


【解决方案1】:

如果您收到具有相同结构且属性名称发生变化的json数据,则需要进行反思,例如:

{
  FirstName1: "Sample",
  LastName1: "LName",
  Address1: [
    {
      type1: "Temp",
      street1: "test stree",
      
    },
    {
      type1: "Perm",
      street1: "test stree",
      
    }
  ]
}

{
  FirstName2: "Sample",
  LastName2: "LName",
  Address1: [
    {
      type2: "Temp",
      street2: "test stree",
      
    },
    {
      type2: "Perm",
      street2: "test stree",
      
    }
  ]
}

在您的情况下,它看起来像是一个属性名称匹配问题,您可以像这样注释您的 java pojo:

public class Parent{

  @JsonProperty("FirstName")
  private String Name1;

  @JsonProperty("LastName")
  private String Nama2;

  private List<Address> address;
}
   
public class Address{
    
  private String type;
    
  @JsonPRoperty("street")
  private String data;
}

最后,您可以使用标准 Jackson 库反序列化您的 json 对象:

new ObjectMapper().readValue(json, Parent.class);

【讨论】:

    猜你喜欢
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2013-01-26
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多