如何找到字段的JSON密钥(jackson)?

mar*_*ser 5 java reflection json annotations jackson

我有以下问题:我像往常一样导出我的用户对象,jackson.databind.ObjectMapper并且工作正常:({"address":{"village":"NY"},"prename":"Joe"}).

现在我必须使用Java反射获取密钥(for addressprename).如果该字段具有注释@JsonProperty,则获取此密钥没有问题.但是这个注释并不存在于所有领域(例如m_address领域).

如何杰克逊映射器知道什么领域中的每个JSON对象分配到一个类的对象?我读到ObjectMapper试图调用getter左右.

但我不知道如何才能找到合适的吸气剂.

我知道这可能不是解决我问题的最美妙的方法,但我没有找到任何方法ObjectMapper:mapper.getJSONKeyByName(field).如果这样的事情存在甚至更好.:)

有没有办法找到合适的吸气剂的领域,确实有点像mapper.getJSONKeyByName(field)上存在ObjectMapper

Main.java

public static void main(String[] args) throws Exception {
    ObjectMapper mapper = new ObjectMapper();   

    // Object to JSON as usual
    mapper.writeValue(System.out, new User("Joe", new Address("NY")));
    // {"address":{"village":"NY"},"prename":"Joe"}


    // Lookup with reflection
    for (Field field : User.class.getDeclaredFields()) {
        field.setAccessible(true);
        try {
            if (field.isAnnotationPresent(JsonProperty.class)) {
                System.out.println("JSON-Key with annotation: " +
                    field.getAnnotation(JsonProperty.class).value());
                    // JSON-Key with annotation: prename
            } else {
                //TODO do something to get "JSON-Key without annotation: address
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

User.java

public class User implements Serializable {
    @JsonProperty(value="prename")
    @Validationinfo(name="prename", required=true, maxlenght=20)
    private String m_name;
    private Address m_address;

    public User(String name, Address a) {
        m_name = name;
        m_address = a;
    }

    @JsonIgnore
    public String getName() {
        return m_name;
    }

    public void setName(String name) {
        m_name = name;
    }

    public Address getAddress() {
        return m_address;
    }

    public void setAddress(Address address) {
        m_address = address;
    }
}
Run Code Online (Sandbox Code Playgroud)

Address.java

public class Address implements Serializable {

  @JsonProperty(value="village")
  @Validationinfo(name="village", required=false, maxlenght=10)
  private String m_village;

  public Address(String village) {
    m_village = village;
  }

  public String getVillage() {
    return m_village;
  }

  public void setVillage(String village) {
    m_village = village;
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

代码被简化了.我有一个REST服务来完成这个writeValue 部分.反射部分是在静态递归方法上完成的User.

问题是Validationinfo我的字段上有一个自定义注释(包含required,maxlength等),还有一个名称参数.此名称与@JsonProperty注释中的名称相同.

在JavaScript应用程序上,我想合并用户字段的值与ValidationInfos.为此我必须确保每一个validationInfos->name都是独一无二的.因此,我必须在带注释的Vaditioninfo->namewhith前面添加其父级的JSON序列化名称/密钥(请参阅REST响应"address.village").

我锁定的其余响应:

  {
    "user": {
       "prename": "Joe",
       "address" : {
          "village": "NY"
       }
     }, "validationInfos": [{
          "name": "prename",
          "required": true,
          "maxlenght": 10
         }, {
          "name": "address.village",
          "required": false,
          "maxlenght": 20
         }]
  }
Run Code Online (Sandbox Code Playgroud)

在JavaScript中我打算做以下事情:

for (var i = 0; i < data.validationInfos.length;; i++) {
  var element = data.validationInfos;
  element.value = eval ("data.user." + element.name);
}
Run Code Online (Sandbox Code Playgroud)

vsm*_*kov 6

你应该使用jackson内省而不是纯java反射.它将允许您根据序列化配置发现映射到java字段/方法的json属性.

JavaType userType = mapper.getTypeFactory().constructType(User.class);
BeanDescription introspection =
    mapper.getSerializationConfig().introspect(userType);
List<BeanPropertyDefinition> properties = introspection.findProperties();
// do some processing over properties...
Run Code Online (Sandbox Code Playgroud)