gpt4 book ai didi

java - 使用 GSON 反序列化数组

转载 作者:行者123 更新时间:2023-12-01 08:54:51 25 4
gpt4 key购买 nike

所以,我对这个 Json 世界很陌生,我正在尝试使用 Gson 将下面的 Json 解析为 java 中的一个类,但我不确定这是否是正确的方法,因为我想要这个成为一个 map 列表,其中 nomeArquivo 将成为该 map 的关键,你们能帮助我实现这一目标吗?或者我发帖的方式可以吗?

测试类

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类

public class FastqcJson {

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

....
}

打印对象

FastqcJson [nomeArquivo=SRR3192396, mediaBaseNumeros={1=31.939449600540865, 2=32.05829640249262}]
FastqcJson [nomeArquivo=SRR3192397, mediaBaseNumeros={1=32.01549563582736, 2=32.13918804626231}]

Json 文件

[   [   
{
"color": "#5cb85c",
"data": [
[
1,
31.939449600540865
],
[
2,
32.05829640249262
]
],
"name": "SRR3192396"
},
{
"color": "#5cb85c",
"data": [
[
1,
32.01549563582736
],
[
2,
32.13918804626231
]
],
"name": "SRR3192397"
}
]
]

最佳答案

没有内置方法可以执行此操作,因为“数据”是其 native JSON 表示形式的数组数组。

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

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();
}
}

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

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

关于java - 使用 GSON 反序列化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com