Does anyone knows a java library that could easily encode java Maps into json objects and the other way around?
UPDATE
For reasons couldn\'
I guess the real question would be which JSON library (from org.json's page) would NOT allow doing this. As far as I know every single library there would allow this in some form. So every library mentioned so far works.
And to add some information, Jackson works very well with all kinds of data including basic Maps and Lists:
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValue(list);
List listOfMaps = mapper.readValue(json, List.class);
which would handle this particular case. While generic type information can be used, it is optional when using "natural" binding to JDK container types.
You can view the site from Json.org for the list of good JSON libraries in Java.
JSon.org's own implementation JSONObject
can do just that.
From their 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);
you can do
JSONObject json = new JSONObject(map);
To convert JSON String back to object....
String jsonString = "{\"name\" : \"some name\", \"age\" : 10}";
JSONObject json = new JSONObject(jsonString);
and you can access values like:
int age = json.getInt("age");
Constructor JavaDoC
Construct a JSONObject from a source JSON text string. This is the most commonly used JSONObject constructor.
Parameters: source A string beginning with
{
(left brace) and ending with}
(right brace).
We use http://json-lib.sourceforge.net/ in our project, it works just fine.
JSON-Simple looks relatively easy to use (examples below).
Map to JSON:
Map map = new HashMap();
map.put("name", "foo");
map.put("nickname", "bar");
String jsonText = JSONValue.toJSONString(map);
JSON to List/Map:
String s = yourJsonString;
List list = (JSONArray) JSONValue.parse(s);
Map map = (JSONObject) list.get(0);
When using google 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();
// when using 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<String,Object> userData = mapper.readValue(jp, Map.class);
userData.get("dayOfWeek");
// process
// after binding, stream points to closing END_OBJECT
}
You can use Google Gson for that. It has excellent support for Generic types.
Here's an 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}
}
}