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;
}
谁能帮帮我,我如何反序列化以下 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;
}