【问题标题】:Library to encode/decode from json to java.util.Map?从 json 编码/解码到 java.util.Map 的库?
【发布时间】:2011-01-30 14:08:47
【问题描述】:

有没有人知道一个可以轻松地将 java Maps 编码为 json 对象的 java 库,反之亦然?

更新

由于无法解释的原因(有时我讨厌),我不能在我的环境中使用泛型。

我想做的是有这样的东西:

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 );

【问题讨论】:

标签: java json map converter


【解决方案1】:

您可以为此使用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}
    }

}

【讨论】:

  • 有没有办法解码(反序列化)为非通用地图?
  • Map&lt;String, String&gt; 替换为Map&lt;String, Object&gt;Map&lt;Object, Object&gt;。或者,对 OO 更友好,只需使用完全值得的 Javabean。 Gson 也可以完美处理。例如,请参阅此答案:stackoverflow.com/questions/1688099/converting-json-to-java/…
  • 问题是我使用的环境不支持泛型,(呃。不要问我如何或为什么,我只是不能使用它们)以及我是什么尝试 find 是一种将普通地图列表转换为 json 并将它们返回的方法。
  • 我明白了。它是否以任何方式运行 Java 1.5?否则 Gson 不会以任何方式运行。你可以考虑看看杰克逊:jackson.codehaus.org(这里是jackson.codehaus.org/TutorialCtrl+F关于“无类型”的教程,以实现你想要的相同)。顺便说一句,我建议 Jackson 的原因是因为它 快速。顺便说一句,这里的基准:cowtowncoder.com/blog/archives/2009/02/entry_204.html
  • 很棒的答案。我完全错过了 TypeToken 课程,并且不记得我做错了什么。谢谢你。 :)
【解决方案2】:

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);

【讨论】:

  • 这个成功了。我更喜欢 Gson 进行 bean 绑定,但不幸的是在我的环境中我不能使用 Gson 严重依赖的泛型。 JSON-Simple 有一个小错误,但我认为可以轻松解决:code.google.com/p/json-simple/issues/detail?id=18 我正在使用它,感谢链接
  • 不管怎样,我认为即使使用 GSON 也不必使用泛型——我很确定它也会起作用。
  • 非常感谢,经过数小时的搜索,我得到了答案
【解决方案3】:

您可以从Json.org 查看该站点,以获取 Java 中优秀的 JSON 库的列表。

JSon.org 自己的 implementation 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

从源构造一个 JSONObject JSON 文本字符串。这是最 常用的 JSONObject 构造函数。

参数:source 以字符串开头 以{(左大括号)并以} 结尾 (右大括号)。

【讨论】:

  • 这来自 Map -> 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】:

      使用谷歌 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
              }
      

      【讨论】:

      • 如果您认为相同的确切答案适用于多个问题,那么它们可能是重复的,应该这样标记,您不觉得吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多