Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jackson使用重复键反序列化json_Java_Json_Jackson_Deserialization - Fatal编程技术网

Java 使用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]| +--------------

我正试图使用Jackson解析一个json有效负载,其中包含一个
映射的重复

考虑以下有效载荷

{
“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" ]
}