从json到java.util.Map编码/解码的库?
有谁知道一个java库可以轻松地将java Maps编码为json对象,反过来呢?
UPDATE
由于原因无法解释(我有时讨厌)我不能在我的环境中使用generics。
我想要做的是拥有这样的东西:
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 );
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);
您可以使用Google Gson 。 它对Generic类型有很好的支持。
这是一个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 map = new LinkedHashMap(); 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 map2 = gson.fromJson(json, new TypeToken
您可以从Json.org查看该站点, 以获取Java中的优秀JSON库列表。
JSon.org自己的实现 JSONObject
可以做到这一点。 来自他们的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转换回对象….
String jsonString = "{\"name\" : \"some name\", \"age\" : 10}"; JSONObject json = new JSONObject(jsonString);
并且您可以访问以下值:
int age = json.getInt("age");
构造函数JavaDoC
从源JSON文本字符串构造JSONObject。 这是最常用的JSONObject构造函数。
参数:source以
{
(左括号)开头,以}
结尾的字符串(右大括号)。
我想真正的问题是哪个JSON库(来自org.json的页面)不允许这样做。 据我所知,每个库都会以某种forms允许这种情况。 所以到目前为止所提到的每个图书
为了增加一些信息, jackson可以很好地处理各种数据,包括基本地图和列表:
ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValue(list); List listOfMaps = mapper.readValue(json, List.class);
这将处理这种特殊情况。 虽然可以使用generics类型信息,但在使用“自然”绑定到JDK容器类型时,它是可选的。
我们在项目中使用http://json-lib.sourceforge.net/ ,它运行得很好。
使用谷歌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();
//使用jackson时
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 userData = mapper.readValue(jp, Map.class); userData.get("dayOfWeek"); // process // after binding, stream points to closing END_OBJECT }