2015-11-13 16 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