Java 使用Jackson使用重复键反序列化json
我正试图使用Jackson解析一个json有效负载,其中包含一个Java 使用Jackson使用重复键反序列化json,java,json,jackson,deserialization,Java,Json,Jackson,Deserialization,我正试图使用Jackson解析一个json有效负载,其中包含一个映射的重复键 考虑以下有效载荷 { “foo”:“val1”, “foo”:“val2”, “bar”:“val3” } 我想将其转换为Map类型 例: +--------------+----------------------+ |键(字符串)|值(列表)| +--------------+----------------------+ |foo |[val1,val2]| |巴|[val3]| +--------------
映射的重复键
考虑以下有效载荷
{
“foo”:“val1”,
“foo”:“val2”,
“bar”:“val3”
}
我想将其转换为Map
类型
例:
+--------------+----------------------+
|键(字符串)|值(列表)|
+--------------+----------------------+
|foo |[val1,val2]|
|巴|[val3]|
+--------------+----------------------+
和Jackson处理这件事的最好方法是什么?我希望在Jackson中有一种方法可以注册Map
type的自定义反序列化逻辑。(注意,我无法控制请求中发送的json负载)
谢谢你在这方面的帮助
谢谢 请将此属性JsonTypeInfo.As.EXISTING_属性放入@JsonTypeInfo注释中。它可能有用。检查它是否适合你
使用@JsonAnySetter
反序列化未映射的JSON属性@JsonAnySetter
注释可用于定义“任意setter”变异体
使用@JsonAnyGetter
注释序列化任意属性@JsonAnyGetter
可用于返回映射的方法
POJO定义
Test.java
package oct2020.json;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
public class Test {
private Map<String, List<String>> keyValuesMap = new HashMap<String, List<String>>();
/**
* @return the keyValuesMap
*/
@JsonAnyGetter
public Map<String, List<String>> getKeyValuesMap() {
return keyValuesMap;
}
/**
* @param keyValuesMap
* the keyValuesMap to set
*/
public void setKeyValuesMap(Map<String, List<String>> keyValuesMap) {
this.keyValuesMap = keyValuesMap;
}
@JsonAnySetter
public void duplicateKeyValues(String key, String value) {
List<String> values = null;
if (!keyValuesMap.containsKey(key)) {
values = new ArrayList<String>();
} else {
values = keyValuesMap.get(key);
}
values.add(value);
keyValuesMap.put(key, values);
}
}
@Lucifer这个解决方案回答了你的问题吗?我用List
而不是List
尝试了这个方法,但是MAP
仍然忽略了重复的字段。它覆盖以前的值并存储来自JSON
的最后一个值。我尝试使用MultiMap
仍然没有成功。似乎Jackson自己没有读取重复的键及其值,或者它没有发送到POJO
,在那里我有@JsonAnySetter
和@Jsond的字段。任何获取者和帮助都将不胜感激。
package oct2020.json;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
public class Test {
private Map<String, List<String>> keyValuesMap = new HashMap<String, List<String>>();
/**
* @return the keyValuesMap
*/
@JsonAnyGetter
public Map<String, List<String>> getKeyValuesMap() {
return keyValuesMap;
}
/**
* @param keyValuesMap
* the keyValuesMap to set
*/
public void setKeyValuesMap(Map<String, List<String>> keyValuesMap) {
this.keyValuesMap = keyValuesMap;
}
@JsonAnySetter
public void duplicateKeyValues(String key, String value) {
List<String> values = null;
if (!keyValuesMap.containsKey(key)) {
values = new ArrayList<String>();
} else {
values = keyValuesMap.get(key);
}
values.add(value);
keyValuesMap.put(key, values);
}
}
package oct2020.json;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JSONConverter {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
String json = "{\n\"foo\" : \"val1\",\n\"foo\" : \"val2\",\n\"bar\" : \"val3\"\n,"
+ "\n\"bar\" : \"val3\"\n,\n\"bar\" : \"val3\"\n,\n\"bar\" : \"val3\"\n,"
+ "\n\"bar\" : \"val3\"\n,\n\"bar\" : \"val3\"\n,\n\"bar\" : \"val3\"\n,"
+ "\n\"bar\" : \"val3\"\n,\n\"bar\" : \"val3\"\n,\n\"bar\" : \"val3\"}";
Test test = mapper.readValue(json, Test.class);
Map<String, List<String>> keyValuesMap = test.getKeyValuesMap();
System.out.println(mapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(keyValuesMap));
}
}
{
"bar" : [ "val3", "val3", "val3", "val3", "val3", "val3", "val3", "val3", "val3", "val3" ],
"foo" : [ "val1", "val2" ]
}