从 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<String, String>
替换为Map<String, Object>
或Map<Object, Object>
。或者,对 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 的库?的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift iOS 中解码的 PHP JSON 返回空值