我需要解析这样的JSON:
{
"commodities": {
"39": "GOLD",
"41": "SILVER",
"42": "PLATINUM-APR16",
"85": "SUGAR (11) ",
"108": "WHEAT",
"116": "OIL-MAR16 (WTI CRUDE)",
"130": "CORN ",
"158": "COFFEE ",
"180": "ORANGE S.A.",
"282": "GOLD/JPY",
"304": "GOLD/EUR",
"332": "GOLD/TRY",
"468": "CRB INDEX",
"508": "COPPER",
...and a LOT more...
},
"currencies": {
"2": "USD/JPY",
"35": "AUD/USD",
"38": "USD/ILS",
...and a LOT more...
},如何将这个JSON保存到Map中?所以我可以像这样用它:
String value = mapCommodities.get(key); String value = mapCommodities.get(39) //value equals "GOLD"
问题是,我不知道如何将这个索引标记从JSON解析为整数值。我认为它需要编写自定义的Deserealizer,但实际上并不知道如何编写。
发布于 2016-03-11 13:43:14
创建自定义反序列化程序
public class CustomDeserializer implements JsonDeserializer<List<Map<Integer, String>>>{
@Override
public List<Map<Integer, String>> deserialize(JsonElement element, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
List<Map<Integer, String>> randomList = new ArrayList<>();
JsonObject parentJsonObject = element.getAsJsonObject();
Map<Integer, String> childMap;
for(Map.Entry<String, JsonElement> entry : parentJsonObject.entrySet()){
childMap = new HashMap<>();
for(Map.Entry<String, JsonElement> entry1 : entry.getValue().getAsJsonObject().entrySet()){
childMap.put(Integer.parseInt(entry1.getKey()), entry1.getValue().toString());
}
randomList.add(childMap);
}
return randomList;
}
}用它
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(new TypeToken<ArrayList<Map<Integer, String>>>() {}.getType(), new CityListDeserializer());
Gson gson = builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
List<Map<Integer, String>> randomList = gson.fromJson(String.valueOf(object), new TypeToken<ArrayList<Map<Integer, String>>>() {}.getType());你可以用它
randomList.get(index).get(39);如果您想要it Map<Map<Integer, String>>,也可以这样做。也会更新。但对于非常大的数据集,我不会再对此进行评论。HashMaps将占用相当大的内存
编辑:
你也可以这样做
public class CityListDeserializer implements JsonDeserializer<Map<String, Map<Integer, String>>>{
@Override
public Map<String, Map<Integer, String>> deserialize(JsonElement element, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Map<String, Map<Integer, String>> randomList = new HashMap<>();
JsonObject parentJsonObject = element.getAsJsonObject();
Map<Integer, String> childMap;
for(Map.Entry<String, JsonElement> entry : parentJsonObject.entrySet()){
childMap = new HashMap<>();
for(Map.Entry<String, JsonElement> entry1 : entry.getValue().getAsJsonObject().entrySet()){
childMap.put(Integer.parseInt(entry1.getKey()), entry1.getValue().toString());
}
randomList.put(entry.getKey(), childMap);
}
return randomList;
}
}使用它
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(new TypeToken<Map<String, Map<Integer, String>>>() {}.getType(), new CityListDeserializer());
Gson gson = builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
Map<String, Map<Integer, String>> randomList = gson.fromJson(String.valueOf(object), new TypeToken<Map<String, Map<Integer, String>>>() {}.getType());访问该值
randomList.get("commodities").get(39);这会把金子还给你
所有这些都用于正常的json解析。不确定,但我想,就像我给的一样,只要给出标记,就会使它对Retrofit也有帮助。
发布于 2016-03-11 13:16:02
)您可以这样做:)
首先将响应转换为JSONARRAY,使用
JSONArray jsonArray = new JSONArray("your string");然后您可以迭代,或者因为您知道respobnse的结构,所以您可以访问它,如:)
JSON commodityJSON = jsonArray.getJSONObject(0);
JSON currencies = jsonArray.getJSONObject(1);一旦您让JSON对象访问它,使用
commodityJSON.getString("39");
commodityJSON.getString("41"); 编辑
根据您的评论:)您可以这样做,我相信:)
for (int i = 0; i < jsonArray.length(); ++i) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Iterator<String> objectKeys = jsonObject.keys();
for( String s : yourKeys){
System.out.println(jsonObject.getString(s));
}
}巴迪:)快乐的编码伙伴:)
https://stackoverflow.com/questions/35941060
复制相似问题