Я хочу преобразовать файл 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
Разве это не будет просто сопоставлением строк с объектами?
Обычно проще всего моделировать классы 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},{"key3":4}]}],"field3":"A","field4":"X","field4":"XX","field4" :"B"}] я хочу взять дату1 также в качестве столбца
@Ussopokingo, как правило, это зависит от формата CSV
, которого вы хотите достичь. Вам нужно создать новый вопрос (со ссылкой на него), предоставить пример JSON
полезной нагрузки и пример CSV
вывода и библиотеки, которые вы хотите использовать. В таком случае Jackson
я верю и кто-то должен помочь.
Поле ПАЦИЕНТ просто должно быть
Map<String, Person>