当前位置: 首页 > 知识库问答 >
问题:

如何使用Gson从嵌套的JSON对象获取数据

齐冥夜
2023-03-14

我想从API中获取countynames,它返回嵌套对象;

"countries": {
    "1": {
        "name": "Cyprus",
        "nameTurkish": "KKTC",
        "nameNative": "Kıbrıs"
    },
    "2": {
        "name": "Turkey",
        "nameTurkish": "Türkiye",
        "nameNative": "Türkiye"
    },
    "3": {
        "name": "Monaco",
        "nameTurkish": "Monako",
        "nameNative": "Monaco"
    },

等等,有200多个国家,每个县都有自己的“编号”。最后,我想列出所有“姓名”信息。我想我应该使用JsonDeserializer,但不幸的是我不能。

共有3个答案

桂浩言
2023-03-14

在这里,您可以看到您的数据看起来像HashMap,因此我只是尝试了这种方法,您的数据解析成功,没有出现任何问题:

>

  • 创建Pojo的:

    public class Countries {
        private HashMap<String, Country> countries;
        public HashMap<String, Country> getCountries() { return countries; }
    
        public void setCountries(HashMap<String, Country> countries) { this.countries = countries; }
    }
    
    public class Country {
        private String name;
        private String nameTurkish;
        private String nameNative;
    
        public String getName() { return name; }
        public void setName(String name) { this.name = name;}
        public String getNameTurkish() { return nameTurkish; }
        public void setNameTurkish(String nameTurkish) { this.nameTurkish = nameTurkish; }
        public String getNameNative() { return nameNative; }
        public void setNameNative(String nameNative) { this.nameNative = nameNative; }
    }
    

    创建Gson对象并对其进行分析:

    Gson gson = new Gson();
    
        // Countries Object
        Type testC = new TypeToken<Countries>(){}.getType();
        Countries ob = gson.fromJson(test, testC);
        String newData = gson.toJson(ob.getCountries());
    
        System.out.println("New Data: "+newData);
    
        // All country in HashMap
        Type country = new TypeToken<HashMap<String, Country>>(){}.getType();
        HashMap<String, Country> countryHashMap = gson.fromJson(newData, country);
    
        // Print All HashMap Country
        for (Map.Entry<String, Country> set : countryHashMap.entrySet()) {
            System.out.println("==> "+set.getKey() + " = " + set.getValue());
        }
    

    输出:

    I/System.out: ==> 1 = Country{name='Cyprus', nameTurkish='KKTC', nameNative='Kıbrıs'}
    I/System.out: ==> 2 = Country{name='Turkey', nameTurkish='Türkiye', nameNative='Türkiye'}
    I/System.out: ==> 3 = Country{name='Monaco', nameTurkish='Monako', nameNative='Monaco'}
    

  • 阮昊阳
    2023-03-14

    尝试使用TypeToken。

    Gson gson = new Gson();
    
    List<Country> list = gson.fromJson(gson.toJson(what_you_get_data), new TypeToken<ArrayList<Country>>(){}.getType()); //Country is VO class what you make.
    
    丁星火
    2023-03-14

    整个JSON响应可以被读取为一个JSONObject,其中包含多个元素,您可以遍历这些元素并获取不同的数据。

    String jsonResponse = ""; // Put the entire JSON response as a String 
    JSONObject root = new JSONObject(jsonResponse);
    
    JSONArray rootArray = root.getJSONArray("countries"); // root element of the json respons
    
    for (int i = 0; i < rootArray.length(); i++) {
    
        JSONObject number = rootArray.getJSONObject(i);
        String country = number.getString("name"); // Get country name
    
        // Here you can add `country` into a List
    }
    

    更新:

    但是我的JSON文件中没有数组,它们都是对象,每个国家都在一个对象中,每个对象都有自己的序列化名称

    您可以将其读入JSONOjbect,而不是使用JSONArray,您可以如下所示迭代JSONObject的长度。

    try {
        JSONObject root = new JSONObject(jsonResponse);
        JSONObject countries = root.getJSONObject("countries");
    
        for (int i = 1; i <= countries.length(); i++) {
    
            JSONObject number = countries.getJSONObject(String.valueOf(i));
            String country = number.getString("name"); // Get country name
    
            // Here you can add the `country` into a List
        }
    
    } catch (JSONException e) {
        e.printStackTrace();
    }
    
     类似资料:
    • 有什么方法可以创建一个Gson的自定义转换器来提取字段,从而使regetfit返回appipiate POJO吗?

    • 问题内容: 我正在使用Android应用程序中的API,所有JSON响应均如下所示: 问题是,我所有的POJO有,字段,里面领域是真正的POJO我想要的。 有什么方法可以创建Gson的自定义转换器以始终提取字段,因此改造会返回适当的POJO? 问题答案: 您将编写一个自定义反序列化器,该反序列化器返回嵌入的对象。 假设您的JSON是: 然后,您将获得一个POJO: 然后编写一个反序列化器: 现在,

    • 问题内容: 我正在使用Android应用程序中的API,所有JSON响应均如下所示: 问题是,我所有的POJO有,字段,里面领域是真正的POJO我想要的。 有什么方法可以创建Gson的自定义转换器来提取始终的字段,因此改造会返回适当的POJO? 问题答案: 你将编写一个自定义反序列化器,以返回嵌入式对象。 假设你的JSON是: 然后,你将获得一个ContentPOJO: 然后编写一个反序列化器:

    • 问题内容: 我在下面的对象中尝试获取所有id值。 使用以下代码,我仅获得第一个id值。有没有办法从嵌套对象中获取所有id值,而无需使用任何外部模块。 预期产量 问题答案: 您可以使用如下所示的JavaScript函数来获取嵌套属性: 检查此小提琴以获取可行的解决方案。

    • 问题内容: 我正在与集成的android应用程序上工作。我正在使用fql查询从Facebook获取信息。我的fql方法是 myjson对象具有我想要的所有信息。像这样 问题是如何将该信息存储到不同的阵列中? 请为此修改一些代码。 问题答案: 检查http://www.androidhive.info/2012/01/android-json-parsing- tutorial/

    • 问题内容: 我正在尝试使用具有以下结构的Java中的gson解析一些JSON数据,但是通过在线查看示例,我找不到任何能完成此工作的东西。 有人可以协助吗? 问题答案: 您只需要创建一个Java类结构即可表示JSON中的数据。为了做到这一点,我建议您将JSON复制到此在线JSON Viewer中 ,您会发现JSON的结构更加清晰… 基本上,您需要这些类(伪代码): 请注意,您的类中的属性名称必须与J