Библиотека для кодирования/декодирования с 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.

Ответ 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
        }