Parsing JSON with a random field (java)

牧云@^-^@ 提交于 2020-01-13 13:50:08

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!