2010-03-22 38 views
15

有沒有人知道一個java庫,可以輕鬆地將java地圖編碼成json對象,反之亦然?圖書館編碼/解碼從json到java.util.Map?

UPDATE

至於原因,無法解釋(我恨有時)我不能在我的環境中使用泛型。

什麼」我想要做的是有這樣的事情:

Map a = new HashMap(); 
a.put("name", "Oscar"); 

Map b = new HashMap(); 
b.put("name", "MyBoss"); 
a.put("boss", b) ; 


List list = new ArrayList(); 
list.add(a); 
list.add(b); 


String json = toJson(list); 
// and create the json: 
/* 
    [ 
     { 
     "name":"Oscar", 
     "boss":{ 
       "name":"MyBoss" 
     } 
     }, 
     { 
      "name":"MyBoss" 
     } 
    ] 

    */ 

並能夠再次擁有它作爲地圖

List aList = (List) fromJson(jsonStirng); 
+0

參見:http://stackoverflow.com/questions/338586/a-better-java-json-library –

+0

參見HTTP://計算器.com/questions/443499/json-to-map和http://stackoverflow.com/questions/1957406/generate-java-class-from-json和http://stackoverflow.com/questions/658936/is-there -a-library-to-convert-java-pojos-to-and-from-json-and-xml –

+0

@dma_k感謝您的參考。我實際上需要像最後一個那樣的東西,因爲我不打算綁定到一個bean。 – OscarRyz

回答

14

JSON-Simple看起來相對容易使用(下面的例子)。

地圖JSON:

Map map = new HashMap(); 
    map.put("name", "foo"); 
    map.put("nickname", "bar"); 
    String jsonText = JSONValue.toJSONString(map); 

JSON列出/地圖:

String s = yourJsonString; 
    List list = (JSONArray) JSONValue.parse(s);  
    Map map = (JSONObject) list.get(0); 
+0

這個人做了這項工作。我更喜歡Gson更好的綁定bean,但不幸的是,在我的環境中,我無法使用Gson嚴重依賴的泛型。 JSON-Simple有一個小錯誤,雖然我認爲可以很容易解決:http://code.google.com/p/json-simple/issues/detail?id=18無論如何,我使用這個,謝謝你的鏈接 – OscarRyz

+0

對於它的價值,我認爲即使使用GSON也不需要使用泛型 - 我很確定它也可以工作。 – StaxMan

+0

非常感謝經過幾個小時的搜索我得到了答案 –

33

您可以使用Google Gson了點。它對Generic types有很好的支持。

下面是一個SSCCE

package com.stackoverflow.q2496494; 

import java.util.LinkedHashMap; 
import java.util.Map; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class Test { 

    public static void main(String... args) { 
     Map<String, String> map = new LinkedHashMap<String, String>(); 
     map.put("key1", "value1"); 
     map.put("key2", "value2"); 
     map.put("key3", "value3"); 
     Gson gson = new Gson(); 

     // Serialize. 
     String json = gson.toJson(map); 
     System.out.println(json); // {"key1":"value1","key2":"value2","key3":"value3"} 

     // Deserialize. 
     Map<String, String> map2 = gson.fromJson(json, new TypeToken<Map<String, String>>() {}.getType()); 
     System.out.println(map2); // {key1=value1, key2=value2, key3=value3} 
    } 

} 
+0

有沒有解碼(反序列化)非通用映射的方法? – OscarRyz

+0

通過Map 或Map 替換'Map '。或者,更OO友好的,只需使用一個完整的Javabean。 Gson也可以很好地處理它。看到這個答案爲例:http://stackoverflow.com/questions/1688099/converting-json-to-java/1688182#1688182 – BalusC

+0

問題是我使用的環境不支持泛型,(erhmm。不要問我如何或爲什麼,我只是,不能使用它們),而我試圖找到的方法是將簡單的地圖列表轉換爲json並將其返回。 – OscarRyz

4

您可以從Json.org查看網站的良好的Java JSON庫列表。

JSon.org自己的implementationJSONObject可以做到這一點。 從他們的Javadoc

/** 
    * Construct a JSONObject from a Map. 
    * 
    * @param map A map object that can be used to initialize the contents of 
    * the JSONObject. 
    */ 
    public JSONObject(Map map); 

你可以做

JSONObject json = new JSONObject(map); 

要JSON字符串轉換回對象....

String jsonString = "{\"name\" : \"some name\", \"age\" : 10}"; 
JSONObject json = new JSONObject(jsonString); 

,你可以像訪問值:

int age = json.getInt("age"); 

Constr uctor JavaDoC

從源構建JSONObject JSON文本字符串。這是常用的JSONObject構造函數中最爲常見的 。

參數:source開始 與{(左大括號)的字符串,並與} (右括號)結束。

+0

這從地圖 - > JSONObject,但提問者想要兩個方向。 – ThomasW

3

我想真正的問題是哪個JSON庫(來自org.json的頁面)不允許這樣做。據我所知每一個圖書館都會允許這種形式。 因此,迄今爲止提到的每個圖書館都有效。

,並增加了一些資料,Jackson作品非常好,各種數據,包括基本的地圖和列表:

ObjectMapper mapper = new ObjectMapper(); 
String json = mapper.writeValue(list); 
List listOfMaps = mapper.readValue(json, List.class); 

這將處理這種特殊情況。儘管可以使用泛型類型信息,但在使用「自然」綁定到JDK容器類型時它是可選的。

0

使用谷歌gson時。

var getRowData = 
[{ 
    "dayOfWeek": "Sun", 
    "date": "11-Mar-2012", 
    "los": "1", 
    "specialEvent": "", 
    "lrv": "0" 
}, 
{ 
    "dayOfWeek": "Mon", 
    "date": "", 
    "los": "2", 
    "specialEvent": "", 
    "lrv": "0.16" 
}]; 

    JsonElement root = new JsonParser().parse(request.getParameter("getRowData")); 
    JsonArray jsonArray = root.getAsJsonArray(); 
    JsonObject jsonObject1 = jsonArray.get(0).getAsJsonObject(); 
    String dayOfWeek = jsonObject1.get("dayOfWeek").toString(); 

//使用傑克遜

JsonFactory f = new JsonFactory(); 
       ObjectMapper mapper = new ObjectMapper(); 
      JsonParser jp = f.createJsonParser(getRowData); 
      // advance stream to START_ARRAY first: 
      jp.nextToken(); 
      // and then each time, advance to opening START_OBJECT 
     while (jp.nextToken() == JsonToken.START_OBJECT) { 
      Map<String,Object> userData = mapper.readValue(jp, Map.class); 
      userData.get("dayOfWeek"); 
      // process 
      // after binding, stream points to closing END_OBJECT 
     } 
+0

如果您認爲同一確切答案適用於多個問題,也許它們是重複的,應該標記爲這樣,您不覺得嗎? –