[英]Deserializing arrays using GSON
因此,我對這個Json世界還很陌生,我正嘗試使用Gson將下面的Json解析為java中的一個類,但是我不確定這是否正確,因為我希望這是一個正確的方法。地圖列表,其中nomeArquivo將成為該地圖的關鍵,你們可以幫助我實現這一目標嗎? 還是我張貼的這種方式很好?
測試班
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();
}
}
}
豆類
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}]
傑森文件
[ [
{
"color": "#5cb85c",
"data": [
[
1,
31.939449600540865
],
[
2,
32.05829640249262
]
],
"name": "SRR3192396"
},
{
"color": "#5cb85c",
"data": [
[
1,
32.01549563582736
],
[
2,
32.13918804626231
]
],
"name": "SRR3192397"
}
]
]
由於“數據”是以其本機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();
}
}
在使用GsonBuilder.registerTypeAdapter(MediaBase.class, new MediaBaseAdapter())
創建GSON實例期間添加此適配器GsonBuilder.registerTypeAdapter(MediaBase.class, new MediaBaseAdapter())
然后適配器將正確打包GsonBuilder.registerTypeAdapter(MediaBase.class, new MediaBaseAdapter())
壓縮數據類型。
請注意,這是從內存寫入的,我無法驗證它是否可以編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.