【问题标题】:How to Convert gson to LinkedHashMap<String, List<String>>?如何将 gson 转换为 LinkedHashMap<String, List<String>>?
【发布时间】:2014-07-28 04:40:10
【问题描述】:

我是 gson 新手,我想知道如何将 json 数据转换为 LinkedHashMap&lt;String, List&lt;String&gt;&gt;

我的 json 数据如下所示:

{ "data": 
    {
        "data1": ["asdf", "qwer"],
        "data2": ["xczv", "aweqrfds123", "sfdgq234"],
        "data3": ["dsafasd", "xcvr123", "sdfa324123"] 
    }
}

data的json数据的字段名是动态的,所以我想把data的json数据转换成LinkedHashMap&lt;String, List&lt;String&gt;&gt;

我该怎么做?

【问题讨论】:

    标签: gson retrofit


    【解决方案1】:

    您可以使用TypeToken 将其转换为使用Gson#fromJson(Reader,Type) 的预期类型

    根据 JSON 字符串,它是 LinkedHashMap&lt;String,LinkedHashMap&lt;String,ArrayList&lt;String&gt;&gt;&gt;

    示例代码:

    BufferedReader reader = new BufferedReader(new FileReader(new File("json.txt")));
    Type type = new TypeToken<LinkedHashMap<String,LinkedHashMap<String,ArrayList<String>>>>() {}.getType();
    
    LinkedHashMap<String,LinkedHashMap<String,ArrayList<String>>> data = new Gson().fromJson(reader, type);
    LinkedHashMap<String,ArrayList<String>> innerMap = data.get("data");
    
    System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(innerMap));
    

    【讨论】:

    • 这是一个很酷但很棘手的方法,我什至在修复了一些语法错误后让它工作,但它不是通用的,例如如果您将 'data4' 添加到 json 中的值不是字符串列表,它将无法正常工作,所以我会坚持使用经典方法。
    • 我无法创建 POJO,因为根据 OP,JSON 字符串键是动态的,在这种情况下 Map 可以完美运行。您可以将其更改为 Object 作为 Map 中的值。
    • 它“完美运行”,直到我在 json 中添加类似 "data4":"foo" 的内容,此时您将获得 IllegalStateException。
    • 正如我所说,您使用 Map&lt;String,Object&gt; 然后使用 instanceof 运算符来检查值类型。
    • 它让一切变得更加复杂和棘手。如果您可以生成一个类并避免所有这些复杂性,为什么要这样做?
    【解决方案2】:

    这不是它在 Gson 世界中的工作方式 - 您无法将 JSON 转换为您想要的 任何 Java 类,除非您想手动完成所有这些操作。常用方法如下所述:

    1. 创建一个与您的 JSON 格式匹配的 Java 类,例如您可以使用此处描述的 Java 类生成器:http://jsongen.byingtondesign.com/
    2. 使用 GsonBuilder 从文件中读取您的 Json 并将其导入到生成的类中

    我使用了这种方法,并且生成的 Java 文件(在我修复了初始 JSON 中的一个小语法错误之后)如下所示:

    package com.json;
    
    import java.util.List;
    
    public class Data{
        private List data1;
        private List data2;
        private List data3;
    
        public List getData1(){
            return this.data1;
        }
        public void setData1(List data1){
            this.data1 = data1;
        }
        public List getData2(){
            return this.data2;
        }
        public void setData2(List data2){
            this.data2 = data2;
        }
        public List getData3(){
            return this.data3;
        }
        public void setData3(List data3){
            this.data3 = data3;
        }
    }
    

    要开始使用新创建的类,您可以使用以下模板:

            is = new InputStreamReader(new FileInputStream(new File('<path-to-json>')), "UTF-8")/;
            Gson gson = new GsonBuilder().create();
            Data d = gson.fromJson(is, Data.class);
            // Start using your d instance here
    

    【讨论】:

    • 我不确定你的意思。请在新答案中提供代码示例。
    猜你喜欢
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多