我想编写一个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"
}
答案 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
请注意,此地图不会(不能)维护订单。