[英]Jackson - Java Objects with List<Map<String,String>> to Json String conversion
我想從 Java 對象生成 JSON 字符串
public class Resource {
String name;
List<Item> items;
public String resourceAsJson(Resource resource) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(resource);
}
哪里項目
public class Item {
Map<String, String> systemFields;
Map<String, String> dataFields;
}
此時 JSON String 的形式是
{
"name": "Person",
"items": [
{
"systemFields": {
"systemField1": "xxx",
"systemField2": "xxx",
"systemField3": "x"
},
"dataFields": {
"dataField1": "xxx",
"dataField2": "xxx",
"dataField3": "x"
}
}
]
}
我試圖獲得的是不同形式的 JSON(省略 Item 並在一個 Json 表中有“系統字段”“數據字段”)
{
"Person":[
{
"systemField1": "xxx",
"systemField2": "xxx",
"systemField3": "Warsaw",
"dataField1": "xxx",
"dataField2": "xxx",
"dataField3": "xxx"
}
]
}
有沒有辦法在不改變模型的情況下用傑克遜做到這一點?
在這種情況下, POJO
默認表示不是您想要的,您需要實現自定義序列化程序。 在您的情況下,它們可能如下所示:
class ResourceJsonSerializer extends JsonSerializer<Resource> {
@Override
public void serialize(Resource value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeFieldName(value.getName());
gen.writeObject(value.getItems());
gen.writeEndObject();
}
}
class ItemJsonSerializer extends JsonSerializer<Item> {
@Override
public void serialize(Item value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
writeMap(value.getSystemFields(), gen);
writeMap(value.getDataFields(), gen);
gen.writeEndObject();
}
private void writeMap(Map<String, String> map, JsonGenerator gen) throws IOException {
if (map != null) {
for (Map.Entry<String, String> entry : map.entrySet()) {
gen.writeStringField(entry.getKey(), entry.getValue());
}
}
}
}
您可以使用com.fasterxml.jackson.databind.annotation.JsonSerialize
注釋注冊它們:
@JsonSerialize(using = ResourceJsonSerializer.class)
class Resource {
和:
@JsonSerialize(using = ItemJsonSerializer.class)
class Item {
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.