Разбор JSON со случайным полем (java)

Я хочу преобразовать файл 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

Поле ПАЦИЕНТ просто должно быть Map<String, Person>

JB Nizet 08.04.2019 18:40

Разве это не будет просто сопоставлением строк с объектами?

Dave Newton 08.04.2019 18:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
812
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Таким образом, Wrapper будет выглядеть так:

@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
Ответ принят как подходящий

Используя библиотеку 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.

Смотрите также:

Привет, что, если мне нужно взять столбцы, которые являются вложенными объектами в jsonObject , например: [{"field1":"1","field2":[{"date1":[{"key1":1},{" key2":3},{"k‌​ey3":4}]}],"field3":‌​"A","field4":"X","fi‌​eld4":"XX","field4" :‌​"B"}] я хочу взять дату1 также в качестве столбца

Ussopokingo 03.12.2019 14:27

@Ussopokingo, как правило, это зависит от формата CSV, которого вы хотите достичь. Вам нужно создать новый вопрос (со ссылкой на него), предоставить пример JSON полезной нагрузки и пример CSV вывода и библиотеки, которые вы хотите использовать. В таком случае Jackson я верю и кто-то должен помочь.

Michał Ziober 03.12.2019 14:44

Другие вопросы по теме