我正在从服务器请求数据,该服务器以JSON格式返回数据 . 在发出请求时将HashMap转换为JSON并不难,但另一方面似乎有点棘手 . JSON响应如下所示:
{
"header" : {
"alerts" : [
{
"AlertID" : "2",
"TSExpires" : null,
"Target" : "1",
"Text" : "woot",
"Type" : "1"
},
{
"AlertID" : "3",
"TSExpires" : null,
"Target" : "1",
"Text" : "woot",
"Type" : "1"
}
],
"session" : "0bc8d0835f93ac3ebbf11560b2c5be9a"
},
"result" : "4be26bc400d3c"
}
最简单的方法是访问这些数据?我正在使用GSON模块 .
16 回答
我用过这段代码:
干得好:
此代码有效:
我知道这是一个相当古老的问题,但我正在寻找一种解决方案,通常将嵌套的JSON反序列化为
Map<String, Object>
,但一无所获 .我的yaml反序列化器的工作方式,它默认JSON对象为
Map<String, Object>
,当你没有't specify a type, but gson doesn'似乎这样做 . 幸运的是,您可以使用自定义反序列化器来完成它 .我使用下面的反序列化器自然地反序列化任何东西,默认
JsonObject
到Map<String, Object>
和JsonArray
s到Object[]
s,其中所有的孩子都被类似地反序列化 .handlePrimitive
方法中的混乱是为了确保你只获得一个Double或一个整数或一个Long,并且可能更好,或者至少简化如果你可以获得BigDecimals,我相信这是默认的 .您可以注册此适配器,如:
然后称之为:
我不确定为什么这不是gson中的默认行为,因为它在大多数其他半结构化序列化库中...
更新新的Gson lib:
您现在可以直接将嵌套的Json解析为Map,但是您应该知道如果您尝试将Json解析为
Map<String, Object>
类型:它将引发异常 . 要解决此问题,只需将结果声明为LinkedTreeMap
类型 . 示例如下:使用谷歌的Gson 2.7(可能是早期版本,但我使用当前版本2.7测试),它很简单:
返回
com.google.gson.internal.LinkedTreeMap
类型为com.google.gson.internal.LinkedTreeMap
,并在嵌套对象,数组等上递归工作 .我像这样运行OP示例(简单地用单引号替换double并删除空格):
并获得以下输出:
这是Kevin Dolan's answer的附录而不是一个完整的答案,但我无法从Number中提取类型 . 这是我的解决方案:
我有完全相同的问题,最后到此为止 . 我有一个不同的方法似乎更简单(可能是更新版本的gson?) .
以下是json
下列
输出
您可以在导航jsonObject时使用instanceof动态检查 . 就像是
它对我有用,所以它必须适合你;-)
试试这个,它会奏效 . 我把它用于 Hashtable .
将 KioskStatusResource 替换为您的 class ,将 Integer 替换为您的 class .
这是我一直在使用的:
从gson 2.8.0开始支持以下版本
我已经克服了自定义JsonDeSerializer的类似问题 . 我试图让它有点通用但仍然不够 . 这是一个满足我需求的解决方案 .
首先,您需要为Map对象实现一个新的JsonDeserializer .
并且deserialize方法看起来类似于:
与此解决方案一致的是,我的Map 's key is always of Type 1001845 . However by chaning some things someone can make it generic. In addition, i need to say, that the value'类应该在构造函数中传递 . 所以我的代码中的方法
getMyType()
返回Map的值的类型,它在构造函数中传递 .您可以参考这篇文章How do I write a custom JSON deserializer for Gson?,以了解有关自定义反序列化器的更多信息 .
这是一个可以做到这一点的单线程:
You can use this class instead :) (处理偶数列表,嵌套列表和json)
转换 JSON string to hashmap 使用此:
JSONObject通常在内部使用
HashMap
来存储数据 . 因此,您可以在代码中将其用作Map .例,