首页 > 解决方案 > 操作 JSON 文件并在操作完成后将其解析为 Object - 在内存中

问题描述

我的主要目标是从 JSON 文件中获取信息并在内存中对其进行操作(尝试解决内存中的语法问题)。之后,使用 com.google.gson.JsonParser 将操作后的值解析为一个 Object,并让旧 File 保持原样(包括语法错误)。

我设法使用 RandomAccessFile 操作文件,然后在使用“new FileReader”时解析它。但在运行代码后,我注意到“旧”文件已被修改,情况不应该如此。我不想更改文件本身,而是更改内容并使用 JsonParser 或任何可用的 Parser 将其解析为对象。

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": ""
  }
}

基本上我需要在文件的开头/结尾添加一个“[”和“]”来解决语法问题。

标签: javajsonfileparsingrandomaccessfile

解决方案


json 没有以任何方式进行 melformed,它只是一个像Map<String, Objekt>a这样的地图TypeToken可能有助于解决你的问题:

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

如果你有一个 fileWriter 它会覆盖数据

示例数据:

你好世界

如果你在 0 处写一个 K,它看起来像这样

凯洛世界


推荐阅读