【问题标题】:Jackson Json to POJO mappingJackson Json 到 POJO 的映射
【发布时间】:2017-04-07 09:27:46
【问题描述】:

我在用杰克逊创建映射时有点迷失。我的 Json 具有以下结构

    {
  "d": {
    "__metadata": {
      "uri": "https://apisalesdemo8.successfactors.com:443/odata/v2/JobApplication(1463L)",
      "type": "SFOData.JobApplication"
    },
    "lastName": "K",
    "address": "123 Main Street",
    "cellPhone": "12345",
    "firstName": "Katrin",
    "city": "Anytown",
    "country": "United States",
    "custappattachment": {
      "results": [
        {
          "__metadata": {
            "uri": "https://apisalesdemo8.successfactors.com:443/odata/v2/Attachment(1188L)",
            "type": "SFOData.Attachment"
          },
          "fileExtension": "jpeg",
          "fileName": "hp-hero-img.jpeg",
          "fileContent": "/9j/4AA"
        },
        {
          "__metadata": {
            "uri": "https://apisalesdemo8.successfactors.com:443/odata/v2/Attachment(1189L)",
            "type": "SFOData.Attachment"
          },
          "fileExtension": "jpeg",
          "fileName": "hp-content-bkgd-img.jpeg",
          "fileContent": "/9j/4AAQSk"
        }]}}}

我确实找到了很多处理数组的教程,但我已经因为第一个标记“d”而失败了。 并且根本不需要所有“__metadata”令牌。

我创建了一个 pojo,其中包含 lastName 等属性和一个集合附件。 但是我的代码总是在令牌“d”或“__metadata”处失败

public class ResponseDataObject {


    private String lastName;
    private String address;
    private String cellPhone;
    private String firstName;
    private String city;
    private String country;
    private List<Attachment> attachments = new ArrayList<>();
    .....getters and setters

还有杰克逊读者

    ObjectReader objectReader =
    mapper.readerFor(ResponseDataObject.class);
    ResponseDataObject dataObject = objectReader.readValue(file);

任何提示将不胜感激。

问候 马蒂亚斯

【问题讨论】:

    标签: java json jackson json-serialization


    【解决方案1】:

    您可以使用@JsonIgnoreProperties注解忽略与类中定义的任何成员都不匹配的属性,例如:

    @JsonIgnoreProperties(ignoreUnknown = true)
    public class ResponseDataObject {
    

    这将确保映射所有匹配的属性并忽略其他属性。

    【讨论】:

      【解决方案2】:

      您需要忽略 POJO 中不存在的属性。在DeserializationFeature 中为ObjectMapper 设置以下属性:

      // for version 1.x       
      mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
      // for newer versions
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
      

      反序列化代码:

      ObjectMapper mapper = new ObjectMapper();
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
      mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
      ResponseDataObject dataObject = mapper.readValue(file, ResponseDataObject.class);
      

      并将此注释添加到 ResponseDataObject 类:

      @JsonRootName(value = "d")
      class ResponseDataObject {
      

      【讨论】:

      • 我试过了,但它导致所有属性的值为空,所以我猜它们没有正确映射?
      • 您正在使用稍微不同的代码来解析 jsonvalue,我已经更新了我的代码。试一试。
      • 不,最后一切都是空的
      • 根值始终为“d”是否已修复
      • “d”是问题所在。如果它总是“d”,您可以在使用@SachinGupta 的代码之前将这部分从字符串中切掉
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多