Библиотека для кодирования/декодирования с json на java.util.Map?
Кто-нибудь знает библиотеку java, которая может легко кодировать java-карты в 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 );
Ответы
Ответ 1
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);
Ответ 2
Вы можете использовать Google Gson. Он отлично поддерживает Общие типы.
Здесь 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}
}
}
Ответ 3
Вы можете просмотреть сайт из Json.org для списка хороших библиотек JSON на Java.
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 jsonString = "{\"name\" : \"some name\", \"age\" : 10}";
JSONObject json = new JSONObject(jsonString);
и вы можете получить доступ к следующим значениям:
int age = json.getInt("age");
Конструктор JavaDoC
Построить объект JSONO из источника Текстовая строка JSON. Это самый обычно используемый конструктор JSONObject.
Параметры: источник Начало строки с {
(левая скобка) и заканчивая }
(правая скобка).
Ответ 4
Я предполагаю, что реальный вопрос заключается в том, какую библиотеку JSON (с сайта org.json) НЕ разрешит делать это. Насколько я знаю, каждая библиотека позволяет это в той или иной форме.
Поэтому каждая упомянутая библиотека пока работает.
И чтобы добавить некоторую информацию, Jackson отлично работает со всеми видами данных, включая базовые Карты и Списки:
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValue(list);
List listOfMaps = mapper.readValue(json, List.class);
который будет обрабатывать этот конкретный случай. В то время как общая информация типа может использоваться, она является необязательной при использовании "естественной" привязки к типам контейнеров JDK.
Ответ 5
Мы используем http://json-lib.sourceforge.net/ в нашем проекте, это работает отлично.
Ответ 6
При использовании 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();
//при использовании 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
}