Jackson 将 JSON 反序列化为 pojo 与 map 属性

Jackson deserialize JSON into pojo with map property

谁能帮帮我,我如何反序列化以下 JSON,我无法更改? 我正在使用 Jackson 进行连载。

{      
    "columns": [
      {
        "header": "Heading1",
      },
      {
        "header": "Heading2",
      }
    ],
    "rows": [
       "id": 1,
       "Heading1": {
          "value": "Value1"
       },
       "Heading2": {
          "value": "Value2"
       }
    ]
}

列可以有未知数量的 headers 及其值,例如。 “Header1”用于行数组。

到目前为止我有以下结构:

public class QueryResult {
   private ColumnConfig[] columns;
   private QueryResultRow[] rows;
}
public class ColumnConfig {
   private String header;
}
public class QueryResultRow {
   private int id;
   private Map<String, CellValue> values;
}
public class CellValue{
   private String value;
}

问题是当我反序列化成QueryResult时Map是空的; 我阅读了有关 TypeReference 的内容,但我不知道如何为 QueryResultRow.

中的 属性 值指定 TypeReference>

编辑:

我的 ObjectMapper 代码如下:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
String queryResultString = loadQuery(queryPath);
        QueryResult result = mapper.readValue(queryResultString, QueryResult.class);

queryResultString的内容就是上面的JSON

第一个问题是你的JSON无效。我想应该是这样的,

{
  "columns": [
    {
      "header": "Heading1"
    },
    {
      "header": "Heading2"
    }
  ],
  "rows": [
    {
      "id": 1,
      "Heading1": {
        "value": "Value1"
      },
      "Heading2": {
        "value": "Value2"
      }
    }
  ]
}

那么答案就很简单了。您需要按如下方式更改 QueryResultRow

class QueryResultRow {
    private int id;
    private Map<String, CellValue> values = new HashMap<>();
    
    @JsonAnySetter
    public void addValues(String k, CellValue v) {
        values.put(k, v);
    }
}

那我觉得你应该可以走了。

这是一个完整的工作示例,

public class Main {
    public static void main(String[] args) throws IOException {
        String s = "{\"columns\":[{\"header\":\"Heading1\"},{\"header\":\"Heading2\"}],\"rows\":[{\"id\":1,\"Heading1\":{\"value\":\"Value1\"},\"Heading2\":{\"value\":\"Value2\"}}]}";
        
        ObjectMapper om = new ObjectMapper();
        QueryResult queryResult = om.readValue(s, QueryResult.class);

        System.out.println(queryResult);
    }
}

@Getter
@Setter
@ToString
class QueryResult {
    private ColumnConfig[] columns;
    private QueryResultRow[] rows;
}

@Getter
@Setter
@ToString
class ColumnConfig {
    private String header;
}

@Getter
@Setter
@ToString
class QueryResultRow {
    private int id;
    private Map<String, CellValue> values = new HashMap<>();
    
    @JsonAnySetter
    public void addValues(String k, CellValue v) {
        values.put(k, v);
    }
}

@Getter
@Setter
@ToString
class CellValue{
    private String value;
}