我想反序列化以下JSON对象:

{
  "id":"001",
  "module_name":"Users",
  "name_value_list":
    {
      "user_name": {"name":"user_name", "value":"admin"},
      "full_name": {"name":"full_name", "value":"Lluís Pi"},
      "city": {"name":"full_name", "value":"Barcelona"},
      "postal_code": {"name":"postal_code", "value":"08017"},
      ...
    }
}


变成这样的一些Java对象:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
public class UserEntry
{
  private String id;
  private String moduleName;
  private Person nameValueList;

  public String getId()
  {
    return id;
  }

  public String getModuleName()
  {
    return moduleName;
  }

  public Person getPerson()
  {
    return nameValueList;
  }
}


其中Person是以下类别:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
class Person
{
  private String userName;
  private String fullName;
  private String city;
  private String postalCode;
}


使用杰克逊,但我得到反序列化错误。

如果将字段nameValueList的类型更改为Map,则所有反序列化过程都不会出现问题,并且会得到一个映射,其中键是“名称”值,而值是“值”值。

所以我的问题是:有没有简单的方法可以将这种JSON对象反序列化为具有属性prop_1prop_2prop_3prop_4的Java Pojo?

{
  "name_value_list":
    {
      "prop_1": {"name":"prop_1", "value":"value_1"},
      "prop_2": {"name":"prop_2", "value":"value_2"},
      "prop_3": {"name":"prop_3", "value":"value_3"},
      "prop_4": {"name":"prop_4", "value":"value_4"},
      ...
    }
}

最佳答案

不是很简单,也不是很干净。但是,您可以通过为Person类中的JSON属性实现一个不符合UserEntry POJO上任何属性的setter字段来实现。

@JsonAnySetter
public void putUserField(String userKey, Map<String, String> userValue)
  throws NoSuchFieldException {
    String actualFieldName = getActualFieldName(userKey);
    Field field = this.getClass().getDeclaredField(actualFieldName);
    field.setAccessible(true);
    ReflectionUtils.setField(field, this, userValue.get("value"));
}

private String getActualFieldName(String userKey) {
    return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, userKey);
}


除此之外,我还必须将Person类的Jackson属性更改为

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
  getterVisibility = JsonAutoDetect.Visibility.NONE)


它可以用于诸如“ city”之类的属性,这些属性不需要任何名称转换,因为jackson尝试直接设置失败的字段。

关于java - 如何使用Jackson将“名称”“值”对的JSON数组反序列化为Pojo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21287780/

10-16 06:19