谁能帮我,我怎么能反序列化以下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
编辑:
我的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;
}