我从服务器请求数据,该服务器返回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模块。
发布于 2013-04-11 15:39:29
这就是了:
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
Type type = new TypeToken<Map<String, String>>(){}.getType();
Map<String, String> myMap = gson.fromJson("{'k1':'apple','k2':'orange'}", type);发布于 2012-09-06 17:03:57
下面的代码可以工作:
Gson gson = new Gson();
String json = "{\"k1\":\"v1\",\"k2\":\"v2\"}";
Map<String,Object> map = new HashMap<String,Object>();
map = (Map<String,Object>) gson.fromJson(json, map.getClass());发布于 2011-01-26 06:29:04
我知道这是一个相当古老的问题,但我一直在寻找一种解决方案,将嵌套的JSON反序列化为Map<String, Object>,但一无所获。
我的yaml反序列化程序的工作方式是,当您没有指定类型时,它会将JSON对象默认为Map<String, Object>,但gson似乎不会这样做。幸运的是,您可以使用自定义的反序列化程序来完成此任务。
我使用下面的反序列化程序自然地反序列化任何东西,将JsonObjects默认为Map<String, Object>,将JsonArrays默认为Object[]s,其中所有子对象都进行了类似的反序列化。
private static class NaturalDeserializer implements JsonDeserializer<Object> {
public Object deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) {
if(json.isJsonNull()) return null;
else if(json.isJsonPrimitive()) return handlePrimitive(json.getAsJsonPrimitive());
else if(json.isJsonArray()) return handleArray(json.getAsJsonArray(), context);
else return handleObject(json.getAsJsonObject(), context);
}
private Object handlePrimitive(JsonPrimitive json) {
if(json.isBoolean())
return json.getAsBoolean();
else if(json.isString())
return json.getAsString();
else {
BigDecimal bigDec = json.getAsBigDecimal();
// Find out if it is an int type
try {
bigDec.toBigIntegerExact();
try { return bigDec.intValueExact(); }
catch(ArithmeticException e) {}
return bigDec.longValue();
} catch(ArithmeticException e) {}
// Just return it as a double
return bigDec.doubleValue();
}
}
private Object handleArray(JsonArray json, JsonDeserializationContext context) {
Object[] array = new Object[json.size()];
for(int i = 0; i < array.length; i++)
array[i] = context.deserialize(json.get(i), Object.class);
return array;
}
private Object handleObject(JsonObject json, JsonDeserializationContext context) {
Map<String, Object> map = new HashMap<String, Object>();
for(Map.Entry<String, JsonElement> entry : json.entrySet())
map.put(entry.getKey(), context.deserialize(entry.getValue(), Object.class));
return map;
}
}handlePrimitive方法中的混乱之处是为了确保你只能得到Double、Integer或Long,而且可能会更好,或者至少在你接受BigDecimals的情况下进行简化,我相信这是默认的。
您可以注册此适配器,如下所示:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());
Gson gson = gsonBuilder.create();然后这样叫它:
Object natural = gson.fromJson(source, Object.class);我不确定为什么这不是gson中的默认行为,因为它在大多数其他半结构化序列化库中都存在……
https://stackoverflow.com/questions/2779251
复制相似问题