Jackson将JSON反序列化为带有map属性的pojo



谁能帮我,我怎么能反序列化以下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,但我不知道如何指定一个TypeReference<String,CellValue>>查询QueryResultRow中的属性值。

编辑:

我的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;
}

最新更新