将键和值从输入JSON转换为Guava ListMultimap?

时间:2015-11-13 17:44:26

标签: 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

{
    "LCD": "Samsung",
    "MOUSE": "HP", 
    "MOUSE": "DELL",
    "LCD": "Apple",
    "LCD": "DELL",
    "DRINK": "Coke",
    "LCD": "Lenovo",
    "DRINK": "Pepsi",
    "KEYBOARD": "Lenovo"
}

1 个答案:

答案 0 :(得分:1)

虽然在JSON中使用重复键不是无效的,但不建议这样做。请参阅此question,特别是此answer引用RFC,该RFC建议不要重复的原因。

鉴于此,将一些条目添加到Multimap中会有一些麻烦的方法。以下代码假定您获得的Json对象采用单行String格式。如果没有,转换成一个并不困难(小心新行,下面的代码并没有解决这个问题)。

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

这不是实现结果的最佳方式,但考虑到输入JSON的性质,可以做的事情并不多,因为大多数JSON解析器(Gson,Jackson)都没有处理重复项。上面的代码将给出以下输出(用于检查条目的最​​终打印语句)

DRINK: Coke
DRINK: Pepsi
MOUSE: HP
MOUSE: DELL
KEYBOARD: Lenovo
LCD: Samsung
LCD: Apple
LCD: DELL
LCD: Lenovo

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