从 json 编码/解码到 java.util.Map 的库?

Posted

技术标签:

【中文标题】从 json 编码/解码到 java.util.Map 的库?【英文标题】:Library to encode/decode from json to 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 );

【问题讨论】:

另见:***.com/questions/338586/a-better-java-json-library 另见***.com/questions/443499/json-to-map和***.com/questions/1957406/…和***.com/questions/658936/… @dma_k 感谢您的参考。我实际上需要像最后一个这样的东西,因为我不想绑定到 bean。 【参考方案1】:

您可以为此使用Google Gson。它对Generic types有很好的支持。

这是SSCCE:

package com.***.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 也可以完美处理。例如,请参阅此答案:***.com/questions/1688099/converting-json-to-java/… 问题是我使用的环境不支持泛型,(呃。不要问我如何或为什么,我只是不能使用它们)以及我是什么尝试 find 是一种将普通地图列表转换为 json 并将它们返回的方法。 我明白了。它是否以任何方式运行 Java 1.5?否则 Gson 不会以任何方式运行。你可以考虑看看杰克逊:jackson.codehaus.org(这里是jackson.codehaus.org/Tutorial,Ctrl+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
        

【讨论】:

如果您认为相同的确切答案适用于多个问题,那么它们可能是重复的,应该这样标记,您不觉得吗?

以上是关于从 json 编码/解码到 java.util.Map 的库?的主要内容,如果未能解决你的问题,请参考以下文章

java 按字节读写二进制文件(Base64编码解码)

在 Swift iOS 中解码的 PHP JSON 返回空值

遇到一个json解码失败的问题

JSON 编码/解码 JavaScript 中的 base64 编码/解码

使用 JSON 解码 Laravel 检索特定数据

jsoncpp 解码编码 中文为空 乱码问题