使用随机场解析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

另见:


PATIENT字段只需要是一个
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