【问题标题】:Jackson Deserialization based on array index or key value基于数组索引或键值的Jackson反序列化
【发布时间】:2020-12-24 14:24:38
【问题描述】:

我有一个返回 2 个对象数组的 API。我的问题是每个对象都有不同的类型。如果每个元素都有 1 个元素,我可以反序列化它,但是当它返回具有不同类型的多个元素时,我正在努力找出如何做到这一点。下面是 JSON 的一个示例。一种可能的反序列化方法是基于数组索引,因为我们可以保证顺序并因此强制类型。另一个是基于路径键的结果,它总是为每个元素返回相同的值。

[
  {
    "path": "matter",
    "result": {
      "criticalDates.dateClosed": {
        "id": "-2",
        "name": "Date Closed",
        "confirmed": false,
        "confirmStatus": "Complete",
        "order": 2,
        "status": "Complete",
        "isConfirmable": true,
        "displayName": "Date Closed",
        "autoCalc": false,
        "__id": "e9d-4329-bb4a-03e644afdfda",
        "__className": "CriticalDate",
        "__tableId": "-24",
        "__classes": [
          "CriticalDate"
        ],
        "date": null
      },
      "matterType": "Family",
      "personActing.fullName": "Michael"
    },
    "status": "ok"
  },
  {
    "path": "matter.cardList",
    "result": [
      {
        "person.firstNames": "Daniel Testing",
        "person.lastName": "Lastname"
      },
      {
        "person.firstNames": "Daniel Testing",
        "person.lastName": "Lastname"
      }
    ],
    "status": "ok"
  }
]

反序列化的适当方法是什么?是否有仅注解的方法?

【问题讨论】:

    标签: java json spring spring-boot jackson


    【解决方案1】:

    一种选择是使用JsonTypeInfo 来确定目标类。

    DTO 示例:

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "path")
    @JsonSubTypes({@JsonSubTypes.Type(value = MatterPath.class, name = "matter"),
            @JsonSubTypes.Type(value = CardListPath.class, name = "matter.cardList")})
    public abstract class AbstractPath {
        private String path;
    
       // Getters and Setters
    }
    
    //------------------------------
    public class MatterPath extends AbstractPath {
        private String matterType;
        // Other fields, getter and setters
    }
    //---------------------------------
    public class CardListPath extends AbstractPath{
        private String cardListType;
    }
    

    说明:

    1. @JsonTypeInfo - 使用此注解根据现有属性确定子类。在我们的例子中path。详情请参阅here
    2. @JsonSubTypes - 使用此注解映射path 字段中的值和要使用的目标类。详情请咨询JsonSubTypes

    测试:

    String json = "[\n" +
            "  {\n" +
            "    \"path\": \"matter\",\n" +
            "      \"matterType\": \"Family\"\n" +
            "  },\n" +
            "  {\n" +
            "    \"path\": \"matter.cardList\",\n" +
            "    \"cardListType\": \"ok\"\n" +
            "  }\n" +
            "]\n";
    AbstractPath[] abstractPaths = objectMapper.readValue(json, AbstractPath[].class);
    System.out.println(Arrays.toString(abstractPaths));
    

    输出:

    [MatterPath{matterType='Family'}, CardListPath{cardListType='ok'}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2013-09-11
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多