首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用GSON反序列化数组

使用GSON反序列化数组
EN

Stack Overflow用户
提问于 2017-02-08 05:37:51
回答 1查看 72关注 0票数 0

所以,我对Json世界非常陌生,我正在尝试使用Gson将下面的Json解析成java中的一个类,但我不确定这是不是正确的方法,因为我希望这是一个地图列表,其中nomeArquivo将是这个地图中的关键,你们能帮我实现这一点吗?或者我这样张贴就可以了?

测试类

代码语言:javascript
运行
复制
public class JsonTeste {

     public static void main(String[] args) {

            Gson gson = new Gson();

            try (Reader reader = new FileReader("foobar.json")) {


                List<FastqcJson[]> list = gson.fromJson(reader, new TypeToken<List<FastqcJson[]>>(){}.getType());


                for (FastqcJson[] fastqcJsons : list) {
                    for (FastqcJson fastqcJson : fastqcJsons) {
                        System.out.println(fastqcJson);
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        }

}

Bean类

代码语言:javascript
运行
复制
public class FastqcJson {

    @SerializedName("name")
    private String nomeArquivo;
    @SerializedName("data")
    private HashMap<Integer, Double> mediaBaseNumeros;

....
}

打印的对象

代码语言:javascript
运行
复制
FastqcJson [nomeArquivo=SRR3192396, mediaBaseNumeros={1=31.939449600540865, 2=32.05829640249262}]
FastqcJson [nomeArquivo=SRR3192397, mediaBaseNumeros={1=32.01549563582736, 2=32.13918804626231}]

Json文件

代码语言:javascript
运行
复制
[   [   
        {
            "color": "#5cb85c",
            "data": [
                [
                    1,
                    31.939449600540865
                ],
                [
                    2,
                    32.05829640249262
                ]               
            ],
            "name": "SRR3192396"
        },
        {
            "color": "#5cb85c",
            "data": [
                [
                    1,
                    32.01549563582736
                ],
                [
                    2,
                    32.13918804626231
                ]
            ],
            "name": "SRR3192397"
        }
    ]
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-08 05:54:33

没有内置的方法可以做到这一点,因为"data“在其原生JSON表示中是一个数组数组。

要做你想做的事情,你需要创建一个包装器类型,并编写一个自定义的反序列化程序:

代码语言:javascript
运行
复制
public class MediaBase {
    private HashMap<Integer, Double> numeros;
    public MediaBase(HashMap<Integer, Double> numeros) {
        this.numeros = numeros;
    }
}

public class FastqcJson {

    @SerializedName("name")
    private String nomeArquivo;
    @SerializedName("data")
    private MediaBase mediaBaseNumeros;

....
}

public class MediaBaseAdapter extends TypeAdapter<MediaBase> {
     @Override
     public MediaBase read(JsonReader reader) throws IOException {
         if (reader.peek() == JsonToken.NULL) {
             reader.nextNull();
             return null;
         }

         HashMap<Integer, Double> output = new HashMap<>();
         reader.beginArray(); //Read "data" as array
         while (reader.hasNext()) {
             reader.beginArray(); //Read data array
             int key = reader.nextInt();
             double value = reader.nextDouble();
             output.put(key, value);
             reader.endArray();
         }
         reader.endArray();
         return new MediaBase(output);
     }

     @Override
     public void write(JsonWriter writer, MediaBase value) throws IOException {
         if (value == null) {
             writer.nullValue();
             return;
         }
         // Inverse of reader
         HashMap<Integer, Double> output = value.numeros;
         writer.beginArray();
         for (Map.Entry<Integer, Double> e : output.entries()) {
             writer.beginArray();
             writer.value(e.getKey());
             writer.value(e.getValue());
             writer.endArray();
         }
         writer.endArray();
     }
}

在使用GsonBuilder.registerTypeAdapter(MediaBase.class, new MediaBaseAdapter())创建GSON实例时添加此适配器,适配器将正确打包和解包您的数据类型。

请注意,这是从内存中编写的,我无法验证它是否可以编译。

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

https://stackoverflow.com/questions/42100479

复制
相关文章

相似问题

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