Манипулировать файлом JSON и анализировать его в объект после выполнения манипуляции - в памяти

Моя основная цель — получить информацию из файла JSON и манипулировать ею в памяти (пытаясь решить синтаксические проблемы в памяти). После этого преобразуйте обработанное значение в объект с помощью com.google.gson.JsonParser и оставьте старый файл таким, каким он был в начале (включая синтаксические ошибки).

Мне удалось манипулировать файлом с помощью RandomAccessFile и впоследствии проанализировать его, используя «новый FileReader». Но после запуска кода я заметил, что «старый» файл был изменен, а этого быть не должно. Я не хочу менять сам файл, но содержимое и анализировать его в объект с помощью JsonParser или любого другого синтаксического анализатора, доступного для этого.

import com.google.gson.JsonArray;
import com.google.gson.JsonParser;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;

public class JsonLoggingParser {


    public static final void main(String[] args) {
        String path = "C:\\CEC\\Dev\\logs\\BIMBO\\2019-04-12asdf.json";

        parseJsonLogFile(path);
    }



    public static void parseJsonLogFile(String filePath){
        try {

            File f = new File(filePath);


            RandomAccessFile randomAccessFile = new RandomAccessFile(f, "rw");

            randomAccessFile.seek(0);
            randomAccessFile.write("[{".getBytes());
            randomAccessFile.seek(f.length());
            randomAccessFile.write("]".getBytes());
            randomAccessFile.close();

            JsonParser jsonParser = new JsonParser();

            Object object = jsonParser.parse(new FileReader(f));

            JsonArray jsonArray = (JsonArray)object;


            System.out.println(jsonArray.toString());

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Вот как выглядит мой файл JSON:

{
  "788ad1bc-e9c8-4be5-b5b6-26ba011dc40e-request": {
    "date": "2019-04-15 10:28:58.943",
    "url": "/BIMBO/credit",
    "handleType": "request",
    "status": "200",
    "request": "Hello There",
    "response": "",
    "performanceDuration": "",
    "principalID": "123456789"
  }
},{
  "788ad1bc-e9c8-4be5-b5b6-26ba011dc40e-response": {
    "date": "2019-04-15 10:28:59.125",
    "url": "/BIMBO/credit",
    "handleType": "response",
    "status": "422",
    "request": "",
    "response": "Hello Back",
    "performanceDuration": "218.696979ms",
    "principalID": ""
  }
}

В основном мне нужно добавить «[» и «]» в начале/конце файла, чтобы решить проблему с синтаксисом.


person Luca Archidiacono    schedule 16.04.2019    source источник
comment
Возможно, посмотрите на Gson, это API для Json github.com/google/gson   -  person Starmixcraft    schedule 16.04.2019
comment
Я предполагаю, что когда в файле есть какие-то синтаксические ошибки, Gson мне не очень поможет, поэтому я должен манипулировать им заранее.   -  person Luca Archidiacono    schedule 16.04.2019
comment
Gson может обрабатывать искаженный json, в сборщике есть опция   -  person Starmixcraft    schedule 16.04.2019
comment
Я видел, что есть опция setLenient. Но если я установлю эту опцию, Gson автоматически прочитает только первый объект Json. И с моей исправлением синтаксиса я хочу иметь несколько объектов в 1 массиве. Вот почему я добавляю [ и ] в начало/конец файла.   -  person Luca Archidiacono    schedule 16.04.2019


Ответы (1)


JSON никоим образом не изменен, это просто карта, такая как Map<String, Objekt> a TypeToken, может помочь решить вашу проблему:

gson.fromJson(reader, new TypeToken<HashMap<String, class>>() {}.getType());

если у вас есть fileWriter, он перезапишет данные

пример данных:

Привет мир

если вы напишете К в 0, это будет выглядеть так

Келло мир

person Starmixcraft    schedule 16.04.2019
comment
Спасибо за вашу помощь. Я попытался, как вы предложили, но если я установлю снисходительность в true и использую TypeToken, я получу только один объект из двух внутри карты. И если я отключу снисходительность, я получу malformedException. - person Luca Archidiacono; 16.04.2019
comment
Если это также не работает, у меня нет идей, лучшее, что вы можете сделать, это загрузить json в оперативную память, поместить свой [ ] и затем разобрать его, как говорится в этом сообщении stackoverflow.com/questions/2537944/, ни одна файловая система не поддерживает добавление символов в файл, поэтому загрузить его в оперативную память - лучший способ сделать это - person Starmixcraft; 16.04.2019
comment
Хорошо, я посмотрю на это. В любом случае спасибо за ваше время и усилия :) - person Luca Archidiacono; 16.04.2019