Json and Guava Multimap

问题描述 投票:0回答:1

我想创建一个多图,将其转换为JSON然后再次返回。这里的问题是,单个值仍然显示为collection / array。

这是我所拥有的

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new GuavaModule());    

Multimap<String, String> map = ArrayListMultimap.create();    
map.put("Cheesecake", "mummy");
map.put("Cookie", "PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43");
map.put("Cookie", "yummy_cookie=choco; tasty_cookie=strawberry");

System.out.println(map);
System.out.println("---");

String json = objectMapper.writeValueAsString(map);
System.out.println("JSON:");
System.out.println(json);  
System.out.println("---");   

JsonNode node = objectMapper.readTree(json);
Multimap<String, String> multimap = objectMapper.readValue(
objectMapper.treeAsTokens(node),
objectMapper.getTypeFactory().constructMapLikeType(
Multimap.class, String.class, String.class));
System.out.println(multimap);

输出:

{Cookie=[PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43, yummy_cookie=choco; tasty_cookie=strawberry], Cheesecake=[mummy]}
---
JSON:
{"Cookie":["PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43","yummy_cookie=choco; tasty_cookie=strawberry"],"Cheesecake":["mummy"]}
---
{Cookie=[PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43, yummy_cookie=choco; tasty_cookie=strawberry], Cheesecake=[mummy]}

我想做某事:

JSON:
{"Cookie":["PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43","yummy_cookie=choco; tasty_cookie=strawberry"],"Cheesecake":"mummy"}
//or even better 
JSON:
{"Cookie":"PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43","Cookie":"yummy_cookie=choco; tasty_cookie=strawberry","Cheesecake":"mummy"}

所以“ mummy”是一个字符串值,而不是json数组中的值。


任何想法如何存档吗?

jackson guava
1个回答
1
投票

您可以使用Multimpap#asMap()视图并用Multimpap#asMap()对其进行序列化以实现所需格式中的第一个。请注意,您需要SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED使用以下命令反序列化类似于地图的对象:

SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED

输出:

DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY

如果要序列化和反序列化第二种所需格式,则需要DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY

© www.soinside.com 2019 - 2024. All rights reserved.