使用随机场解析JSON(java)
我想将使用随机场解析JSON(java),java,json,firebase,csv,gson,Java,Json,Firebase,Csv,Gson,我想将JSON文件转换为CSV文件 我的JSON文件来自存储在Firebase中的数据库,其结构如下: { "PATIENT" : { "-LbhwHC7Y6_umc" : { "age" : 31, "name" : "Phoebe" }, "-LbhwTFJ6xjEf" : { "age" : 20, "name" : "Amy" }, "-LbhxUmJ_dwIC" : { "ag
JSON
文件转换为CSV
文件
我的JSON
文件来自存储在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,因此建议PATIENT
是一个Map
,将这些任意字段名称作为键,将patienta的实例作为每个条目的值
所以包装器应该是这样的:
@Getter
public class Wrapper {
// We want the correct notation & plural, of course
@SerializedName("PATIENT")
private Map<String, Patient> patients;
}
然后,反序列化nad使用类似于:
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
payload中有随机键时,您可以将其反序列化到Jackson
和Gson
库中的Map
另见:
Map
难道它不只是一个字符串到对象的映射吗?嗨,如果我必须在jsonObject中嵌套对象的列,例如:[{“field1”:“1”,“field2”:[{“date1”:[{“key1”:1},{“key2”:3},{“key3”:4}],“field3”:“a”,“field4”:“X”,“field4”:“XX”,“field4”:“B}]我想把date1也当作column@Ussopokingo,通常取决于您想要实现的CSV
格式。您需要创建新问题(带有此链接),提供示例JSON
有效负载和示例CSV
输出以及您想要使用的库。在这种情况下,Jackson
我相信应该有人来帮忙。
age,name
31,Phoebe
20,Amy
28,Joe