2015-11-13 86 views
1

我想写一个REST服务,将只准键值如下:将输入JSON中的键和值转换为Guava ListMultimap?

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

虽然它不是有一个JSON重复键无效的事情,所以不推荐。参考这个question,特别是这个引用RFC的建议为什么不要有重复的这个answer

鉴于此,将条目添加到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,杰克逊)的不采取照顾重复。上面的代码将提供以下输出(用于检查项目的最终打印语句)

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

注意,为了不在此地图(不能)维护。

+0

谢谢,这绝对是这样做的一种方法。我正在考虑一些更好的方法来做到这一点。但正如你所提到的,没有一个json库正在处理重复键,尝试了其中的一些。将尝试更多,以便我不必执行此字符串操作。 另外**你认为接受字符串作为XML将在这里更有意义吗?输入必须由休息服务消耗,并且需要进一步处理。有什么想法吗 ? 是的,你也可以打印为myMap.asMap(); –

+0

如果是我,我会将json转换为json数组。这样,每个键值对都将成为JsonObject。如果是这种情况,那么你可以使用任何流行的Json解析器来读取每个对象,然后将它添加到你的Multimap中。 – Rakesh