【问题标题】:Jackson deserialize JSON into pojo with map propertyJackson 使用 map 属性将 JSON 反序列化为 pojo
【发布时间】:2021-09-23 17:54:57
【问题描述】:

有人可以帮助我,我如何反序列化以下我无法更改的 JSON? 我正在使用 Jackson 进行序列化。

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

列可以有未知数量的标题及其值,例如。行数组中使用了“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 反序列化代码对每个人都有帮助。
  • 向我们展示您的ObjectMapper 反序列化代码。
  • 使用@JsonAnySetter

标签: java jackson


【解决方案1】:

第一个问题是您的 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;
}

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2012-08-19
    • 2023-02-08
    • 2020-12-10
    相关资源
    最近更新 更多