首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Json和Guava Multimap

Json和Guava Multimap
EN

Stack Overflow用户
提问于 2020-04-02 10:05:45
回答 1查看 744关注 0票数 0

我想创建一个multimap,将其转换为JSON,然后再返回。这里的问题是,单个值仍然显示为集合/数组。

这是我有的东西

代码语言:javascript
运行
复制
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);

输出:

代码语言:javascript
运行
复制
{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]}

我想要这样的东西:

代码语言:javascript
运行
复制
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"}

所以“妈妈”是json数组中的一个字符串值。

知道怎么归档吗?

EN

回答 1

Stack Overflow用户

发布于 2020-04-02 15:02:02

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

代码语言:javascript
运行
复制
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new GuavaModule());
objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
objectMapper.enable(SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED);

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.asMap());
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);

输出:

代码语言:javascript
运行
复制
{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]}

如果要序列化和反序列化第二种所需的格式,则需要编写自定义杰克逊序列化程序/反序列化程序

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60989018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档