Java Jackson ObjectMapper用方括号(甚至是单个值)包装每个元素

Java Jackson ObjectMapper用方括号(甚至是单个值)包装每个元素,java,json,jackson,guava,jackson-modules,Java,Json,Jackson,Guava,Jackson Modules,我有两个贴图对象,我将它们合并到Guava的Multimap中。合并后,我试图通过jacksonObjectMapper与GuavaModule对最终映射进行序列化(否则它无法正确序列化)。但是,问题是,即使只有一个值,键的每个值也会作为列表的元素打印(objectmapper将每个值用方括号括起来)。我得到的基本输出如下: { "address": { "city": ["san francisco"] }, "company": { "

我有两个贴图对象,我将它们合并到Guava的Multimap中。合并后,我试图通过jackson
ObjectMapper
GuavaModule
对最终映射进行序列化(否则它无法正确序列化)。但是,问题是,即使只有一个值,键的每个值也会作为列表的元素打印(objectmapper将每个值用方括号括起来)。我得到的基本输出如下:

{
    "address": {
        "city": ["san francisco"]
    },
    "company": {
        "employees": [
            [{
                "name": "David",
                "lastname": "Foobar",
                "age": 22
            }, {
                "name": "Michael",
                "lastname": "FizBuzz",
                "age": 35
            }]
        ]
    },
    "config": {
        "key1": ["value1", "value3"],
        "key2": ["value2"],
        "key4": ["value4"]
    }
}
正如您所看到的,“地址”->“城市”->“旧金山”用方括号括起来,另外,
公司->员工
也被包装了两次。此外,我尝试了
序列化功能。写入单个元素数组(u UNWRAPPED),为true
未来但没有任何改变

    Person person = new Person();
    person.setName("David");
    person.setLastname("Foobar");
    person.setAge(22);

    Person person2 = new Person();
    person2.setName("Michael");
    person2.setLastname("FizBuzz");
    person2.setAge(35);

    Map<String, Map<String, Object>> map1 = new ImmutableMap.Builder<String, Map<String, Object>>()
            .put("config", ImmutableMap.of(
                    "key1", "value1",
                    "key2", "value2"))
            .put("address", ImmutableMap.of("city", "san francisco"))
            .put("company", ImmutableMap.of("employees", Arrays.asList(person, person2)))
            .build();

    Map<String, Map<String, Object>> map2 = new ImmutableMap.Builder<String, Map<String, Object>>()
            .put("config", ImmutableMap.of(
                    "key1", "value3",
                    "key4", "value4"))
            .build();

    Map<String, Multimap<String, Object>> merged = new HashMap<>();
    BiFunction<Multimap<String, Object>,
                Multimap<String, Object>,
                Multimap<String, Object>> remappingFunction = (value1, value2) -> {
        Multimap<String, Object> multimap = HashMultimap.<String, Object>create();
        multimap.putAll(value1);
        multimap.putAll(value2);
        return multimap;
    };


    map1.forEach((key, value) -> merged.merge(key, Multimaps.forMap(value), remappingFunction));
    map2.forEach((key, value) -> merged.merge(key, Multimaps.forMap(value), remappingFunction));

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new GuavaModule());
    objectMapper.configure(SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED, true);
    String str = objectMapper.writeValueAsString(merged);
    System.out.print(str);
}
Person-Person=新的Person();
个人名称(“大卫”);
person.setLastname(“Foobar”);
人。设置(22);
Person person2=新的Person();
人员2.设置名称(“迈克尔”);
人员2.setLastname(“FizBuzz”);
人物2.背景(35);
Map map1=新的ImmutableMap.Builder()
.put(“配置”,ImmutableMap.of(
“键1”、“值1”,
“键2”、“值2”))
.put(“地址”,不可变地图(“城市”、“旧金山”))
.put(“公司”,不可变映射(“员工”,数组.asList(person,person2)))
.build();
Map map2=新的ImmutableMap.Builder()
.put(“配置”,ImmutableMap.of(
“键1”、“值3”,
“键4”、“值4”))
.build();
Map merged=新的HashMap();
双函数重新映射函数=(值1,值2)->{
Multimap Multimap=HashMultimap.create();
multimap.putAll(值1);
multimap.putAll(值2);
返回多重映射;
};
map1.forEach((key,value)->merged.merge(key,Multimaps.forMap(value),remappingFunction));
forEach((key,value)->merged.merge(key,Multimaps.forMap(value),remappingFunction));
ObjectMapper ObjectMapper=新的ObjectMapper();
registerModule(新的GuavaModule());
configure(SerializationFeature.WRITE\u SINGLE\u ELEM\u ARRAYS\u UNWRAPPED,true);
String str=objectMapper.writeValueAsString(合并);
系统输出打印(str);
}
谢谢你的帮助。感谢

根据,MultimapSerializer将所有值集封装在JSON数组中,而不管值的数量如何。我相信这意味着它实际上忽略了
WRITE\u SINGLE\u ELEM\u array\u UNWRAPPED
功能

通过在序列化之前将所有内部
Multimap
实例转换为标准
Map
实例,可以避免此问题。您可以使用以下方法执行此操作:

根据,MultimapSerializer“将所有值集封装在JSON数组中,而不管值的数量如何”。我相信这意味着它实际上忽略了
WRITE\u SINGLE\u ELEM\u array\u UNWRAPPED
功能

通过在序列化之前将所有内部
Multimap
实例转换为标准
Map
实例,可以避免此问题。您可以使用以下方法进行此操作:


从理论上讲,可以添加对
WRITE\u SINGLE\u ELEM\u Array\u UNWRAPPED
的支持(但这是所有序列化程序都必须小心处理的事情,并且不能集中实现),但是如果值本身要序列化为JSON数组,则可能会出现问题。为
jackson dataformat guava
提交一个问题是有意义的。理论上,可以添加对
写入单个元素数组\u UNWRAPPED
的支持(但这是所有序列化程序都必须小心处理的事情,不能集中实现),但如果值本身可以序列化为JSON数组,则可能会出现问题。为
jackson dataformat guava
提交问题是有意义的。
Map<String, Map<String, Collection<Object>>> newMerged = new HashMap<>();
merged.forEach((key, value) -> newMerged.put(key, value.asMap()));
String newStr = objectMapper.writeValueAsString(newMerged);
System.out.println(newStr);
{"address":{"city":"san francisco"},"company":{"employees":[{"name":"David","lastname":"Foobar","age":22},{"name":"Michael","lastname":"FizBuzz","age":35}]},"config":{"key1":["value1","value3"],"key2":"value2","key4":"value4"}}