簡體   English   中英

使用GSON反序列化數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM