Как я могу Потоковый массив Json, который находится внутри объекта JSON? - PullRequest
0 голосов
/ 30 января 2019

У меня действительно большой Json, который мне нужен для потоковой передачи и анализа.Источник выглядит следующим образом:

{
    "Report_Entry": [{
            "FirstName": "Brett",
            "Position": "13_Delta Corp",
            "Worker": "Mr Battles"
        },
        {
            "FirstName": "Dan",
            "Position": "13_Delta Corp",
            "Worker": "Mr Brown"
        }]
}

Я хотел бы сделать что-то вроде этого:

InputStream inStream = null;
JsonReader reader = null;
Gson gson = null;

gson = new Gson();
inStream = new FileInputStream("C:\\Downloads\\largereportdata.json");

reader = new JsonReader(new InputStreamReader(inStream, "UTF-8"));
List<Message> messages = new ArrayList<Message>();
reader.beginArray();
while (reader.hasNext()) {
    Message message = gson.fromJson(reader, Message.class);
    //Process the message 
}
reader.endArray();
reader.close();

class Message{
    public String First_Name = null;
    public String Position = null;
    public String Worker = null;
}

Если я использую gson.fromJson для родительского объекта json массива, товесь объект загружен в ОДИН объект с массивом внутри, но я хотел бы вывести массив из него.

Единственный способ, которым я сейчас вижу, это как-то отредактировать ввод и удалить родительский «Report_Entry» и конечные скобкиЭто ужасный способ сделать это.

Есть ли лучший подход к этому?

К сожалению, источник не может быть изменен, и я должен работать с этим.

Спасибо!Daniel

1 Ответ

0 голосов
/ 05 февраля 2019

Я решил это с помощью API Джексона.

JsonFactory f = new MappingJsonFactory();

        JsonParser jp = new JsonFactory().createParser(new File("C:\\Users\\Downloads\\rootpart.json"));

        ObjectMapper mapper = new ObjectMapper();
        ReportData reportData = null;

        JsonToken current;
        current = jp.nextToken();
        if (current != JsonToken.START_OBJECT) {
            System.out.println("Error: root should be object: quitting.");
            return;
        }
        while (jp.nextToken() != JsonToken.END_OBJECT) {
            String fieldName = jp.getCurrentName();
            current = jp.nextToken();
            if (fieldName.equals("Report_Entry")) {
                if (current == JsonToken.START_ARRAY) {
                    while (current != JsonToken.END_ARRAY) {
                        if (current == JsonToken.START_OBJECT) {
                            reportData = mapper.readValue(jp, ReportData.class);
                            System.out.println(reportData.getKey());
                        }
                        current = jp.nextToken();
                    }
                } else {
                    jp.skipChildren();
                }
            } else {
                jp.skipChildren();
            }

        }

Спасибо!

...