Json и Guava Multimap - PullRequest
       14

Json и Guava Multimap

0 голосов
/ 02 апреля 2020

Я хотел бы создать мультикарту, преобразовать ее в JSON и обратно. Проблема здесь в том, что отдельные значения по-прежнему отображаются как коллекция / массив.

Вот что у меня есть

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.


Есть идеи, как архивировать это?

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете использовать Multimpap#asMap() для просмотра и сериализации с помощью SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED, чтобы получить первый из желаемых форматов. Обратите внимание, что вам потребуется DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY для десериализации объекта, подобного карте, с помощью этого:

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);

Вывод:

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

Если вы хотите сериализовать и десериализовать второй желаемый формат, вам нужно написать собственный сериализатор / десериализатор Jackson .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...