Java 将输入JSON中的键和值转换为Guava ListMultimap?

Java 将输入JSON中的键和值转换为Guava ListMultimap?,java,json,collections,guava,Java,Json,Collections,Guava,我想编写一个REST服务,它将按如下方式删除键值: LCD Samsung MOUSE HP MOUSE Dell DRINK COKE DRINK PEPSI LCD DELL LCD APPLE KEYBOARD Lenovo 接受的最佳格式是什么。如果用户以JSON的形式发送,那么我如何将其读入 List<String, List<String>> 虽然JSON中有重复的键不是无效的,但不建议这样做。请参阅本

我想编写一个REST服务,它将按如下方式删除键值:

LCD      Samsung
MOUSE    HP
MOUSE    Dell
DRINK    COKE
DRINK    PEPSI
LCD      DELL
LCD      APPLE
KEYBOARD Lenovo
接受的最佳格式是什么。如果用户以JSON的形式发送,那么我如何将其读入

List<String, List<String>>

虽然JSON中有重复的键不是无效的,但不建议这样做。请参阅本文件,特别是本文件,其中引用了RFC,该RFC建议为什么不提供副本

有鉴于此,将条目添加到
Multimap
有点麻烦。下面的代码假设您得到的Json对象是单行
String
格式。如果不是,转换成一个也不难(注意换行,下面的代码不考虑这一点)


请注意,此地图不能(无法)维护订单。

谢谢,这绝对是一种方法。我在想更好的办法。但是正如您所提到的,没有一个json库处理重复的键,请尝试其中一些。我将尝试更多,这样我就不必做这个字符串操作。另外,您认为在这里接受字符串作为XML更有意义吗?输入必须由rest服务使用,需要进行进一步的处理。有什么想法吗?是的,您也可以打印为myMap.asMap();如果是我,我会将发送的json转换为json数组。这样,每个键值对都将是一个JsonObject。如果是这种情况,那么您可以使用任何流行的Json解析器来读取每个对象,然后将其添加到多重映射中。
{
    "LCD": "Samsung",
    "MOUSE": "HP", 
    "MOUSE": "DELL",
    "LCD": "Apple",
    "LCD": "DELL",
    "DRINK": "Coke",
    "LCD": "Lenovo",
    "DRINK": "Pepsi",
    "KEYBOARD": "Lenovo"
}
    String jsonStr = new String("{\"LCD\": \"Samsung\",\"MOUSE\": \"HP\",\"MOUSE\": \"DELL\",\"LCD\": \"Apple\",\"LCD\": \"DELL\",\"DRINK\": \"Coke\",\"LCD\": \"Lenovo\",\"DRINK\": \"Pepsi\",\"KEYBOARD\": \"Lenovo\"}");

    // Removing the first and last braces
    jsonStr = jsonStr.substring(1, jsonStr.length() - 1);

    // Create a Guava Multimap
    Multimap<String, String> myMap = ArrayListMultimap.create();

    // Split on comma for each key-value pair
    for(String item: jsonStr.split(",")) {
        // Get the individual key-value pair
        String[] keyValue = item.split(":");

        // Get the values between the the inverted commas
        String key = keyValue[0].substring(keyValue[0].indexOf("\"") + 1, keyValue[0].lastIndexOf("\""));
        String value = keyValue[1].substring(keyValue[1].indexOf("\"") + 1, keyValue[1].lastIndexOf("\""));

        // Add to map
        myMap.put(key, value);
    }

    // Print to check
    for(Map.Entry<String, String> entry: myMap.entries()) {
        System.out.println(entry.getKey() + ": " + entry.getValue());
    }
DRINK: Coke
DRINK: Pepsi
MOUSE: HP
MOUSE: DELL
KEYBOARD: Lenovo
LCD: Samsung
LCD: Apple
LCD: DELL
LCD: Lenovo