2017-02-07 2 views
0

Итак, я довольно новичок в этом мире Json, и я пытаюсь разобрать этот Json ниже в классе Java, используя Gson, но я не уверен, что это правильный путь, потому что я хочу, чтобы это был список карт, где nomeArquivo был бы ключевым в этой карте, можете ли вы, ребята, помочь мне добиться этого? Или так я опубликовал все в порядке?Deserializing массивы с использованием GSON

Тест класс

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" 
     } 
    ] 
] 

ответ

1

Нет встроенного способа сделать это, поскольку «данные» представляют собой массив массивов в своем собственном представлении 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()) и адаптер будет правильно упаковать и распакуйте свой тип данных.

Обратите внимание, что это записано из памяти, и я не смог проверить, что он компилируется.

+0

Извините, но я не понял последнюю часть –

+0

https://github.com/google/gson/blob/master/UserGuide.md#TOC-Custom-Serialization-and-Deserialization – Kiskae

Смежные вопросы