问题
I want to convert a JSON file into a CSV file.
My JSON file comes from a DataBase stored in Firebase and has an structure like this:
{
"PATIENT" : {
"-LbhwHC7Y6_umc" : {
"age" : 31,
"name" : "Phoebe"
},
"-LbhwTFJ6xjEf" : {
"age" : 20,
"name" : "Amy"
},
"-LbhxUmJ_dwIC" : {
"age" : 28,
"name" : "Joe"
}
}
}
I'm trying to do it with 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();
}
}
}
My problem is that I don't know how to create a JSON object with random fields like:
"-LbhwHC7Y6_umc", "-LbhwTFJ6xjEf" and "-LbhxUmJ_dwIC"
generated by Firebase
回答1:
Using Jackson library you have already mapper for JSON and CSV in one library. Simple example which reads your JSOn and generate 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);
}
});
}
}
}
Prints:
age,name
31,Phoebe
20,Amy
28,Joe
Generally, when you have random keys in JSON payload you can deserialise it to Map<String, Object> in Jackson and Gson libraries.
See aslo:
- jackson-dataformats-text - CSV
- jackson-databind - JSON
回答2:
Usually it is easiest to just model Java DTO classes holding the data.
So in your JSON you have an object -let us say wrapper -that contains another object having label PATIENT. And because the fields that PATIENT has are arbitrary names AND it also seems that the data each field contain is actually the Patient it thus suggest that PATIENT is a Map having those arbitrary field names as the keys and instances of patienta as the values of each entry.
So the Wrapper would be like:
@Getter
public class Wrapper {
// We want the correct notation & plural, of course
@SerializedName("PATIENT")
private Map<String, Patient> patients;
}
The Patient would be then like:
@Getter
public class Patient {
private String name;
private Integer age;
}
Deserialisation nad using would then be something like:
Wrapper w = gson.fromJson(new FileReader("c:\\file.json"), Wrapper.class );
w.getPatients().keySet().... // or however it is most comfortable
来源:https://stackoverflow.com/questions/55577959/parsing-json-with-a-random-field-java