Разбор JSON со случайным полем (Java) - PullRequest
2 голосов
/ 08 апреля 2019

Я хочу преобразовать файл JSON в файл CSV.

Мой JSON файл взят из DataBase, хранящегося в Firebase, и имеет такую ​​структуру:

{
  "PATIENT" : {
     "-LbhwHC7Y6_umc" : {
       "age" : 31,
       "name" : "Phoebe"
    },
    "-LbhwTFJ6xjEf" : {
      "age" : 20,
      "name" : "Amy"
    },
    "-LbhxUmJ_dwIC" : {
      "age" : 28,
      "name" : "Joe"
    }
  }
}

Я пытаюсь сделать это с Gson:

package Parser;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.Gson;


public class Main {

public static void main(String[] args) {

    Gson gson = new Gson();

    try {

        BufferedReader br = new BufferedReader(
            new FileReader("c:\\file.json"));



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

}
}

Моя проблема в том, что я не знаю, как создать JSON объект со случайными полями, такими как:

"- LbhwHC7Y6_umc", "-LbhwTFJ6xjEf" и "-LbhxUmJ_dwIC"

генерируется Firebase

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Обычно проще всего моделировать классы Java DTO, содержащие данные.

Итак, в вашем JSON есть объект - скажем, обертка - который содержит другой объект с меткой PATIENT. И поскольку поля, которые PATIENT имеет произвольные имена, И также кажется, что данные, содержащиеся в каждом поле, на самом деле Пациент , таким образом, можно предположить, что PATIENT - это Map с такими произвольными именами полей как ключи и экземпляры Patienta в качестве значений каждой записи.

Так что Обертка будет выглядеть так:

@Getter
public class Wrapper {
    // We want the correct notation & plural, of course
    @SerializedName("PATIENT") 
    private Map<String, Patient> patients;
}

Пациент тогда будет выглядеть так:

@Getter
public class Patient {
    private String name;
    private Integer age;
}

Тогда десериализация и использование будут выглядеть примерно так:

Wrapper w = gson.fromJson(new FileReader("c:\\file.json"), Wrapper.class );
w.getPatients().keySet().... // or however it is most comfortable
0 голосов
/ 09 апреля 2019

Используя библиотеку Jackson, у вас уже есть маппер для JSON и CSV в одной библиотеке. Простой пример, который читает ваш JSOn и генерирует CSV:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SequenceWriter;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;

import java.io.File;
import java.io.IOException;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        // read JSON
        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = mapper.readTree(jsonFile);
        JsonNode patient = root.get("PATIENT");

        // Write CSV
        CsvMapper csvMapper = new CsvMapper();
        CsvSchema schema = CsvSchema.builder()
                .addColumn("age", CsvSchema.ColumnType.NUMBER)
                .addColumn("name")
                .setUseHeader(true)
                .build();
        try (SequenceWriter sequenceWriter = csvMapper.writer().with(schema).writeValues(System.out)) {
            patient.elements().forEachRemaining(node -> {
                try {
                    sequenceWriter.write(node);
                } catch (IOException e) {
                    throw new IllegalStateException(e);
                }
            });
        }
    }
}

Печать:

age,name
31,Phoebe
20,Amy
28,Joe

Как правило, когда у вас есть случайные ключи в полезной нагрузке JSON, вы можете десериализовать ее в Map<String, Object> в Jackson и Gson библиотеках.

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...