首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析JSON标记名称和值以使用Retrofit映射

解析JSON标记名称和值以使用Retrofit映射
EN

Stack Overflow用户
提问于 2016-03-11 13:07:10
回答 2查看 2.3K关注 0票数 2

我需要解析这样的JSON:

代码语言:javascript
复制
{
"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,但实际上并不知道如何编写。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-11 13:43:14

创建自定义反序列化程序

代码语言:javascript
复制
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;
        }
    }

用它

代码语言:javascript
复制
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());

你可以用它

代码语言:javascript
复制
randomList.get(index).get(39);

如果您想要it Map<Map<Integer, String>>,也可以这样做。也会更新。但对于非常大的数据集,我不会再对此进行评论。HashMaps将占用相当大的内存

编辑:

你也可以这样做

代码语言:javascript
复制
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;
        }
    }

使用它

代码语言:javascript
复制
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());

访问该值

代码语言:javascript
复制
randomList.get("commodities").get(39);

这会把金子还给你

所有这些都用于正常的json解析。不确定,但我想,就像我给的一样,只要给出标记,就会使它对Retrofit也有帮助。

票数 2
EN

Stack Overflow用户

发布于 2016-03-11 13:16:02

)您可以这样做:)

首先将响应转换为JSONARRAY,使用

代码语言:javascript
复制
JSONArray jsonArray = new JSONArray("your string");

然后您可以迭代,或者因为您知道respobnse的结构,所以您可以访问它,如:)

代码语言:javascript
复制
JSON commodityJSON = jsonArray.getJSONObject(0);
JSON currencies = jsonArray.getJSONObject(1);

一旦您让JSON对象访问它,使用

代码语言:javascript
复制
commodityJSON.getString("39");
commodityJSON.getString("41"); 

编辑

根据您的评论:)您可以这样做,我相信:)

代码语言:javascript
复制
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));
    }
}

巴迪:)快乐的编码伙伴:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35941060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档