java - 操作 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": ""
}
}
基本上我需要在文件的开头/结尾添加一个“[”和“]”来解决语法问题。
解决方案
json 没有以任何方式进行 melformed,它只是一个像Map<String, Objekt>
a这样的地图TypeToken
可能有助于解决你的问题:
gson.fromJson(reader, new TypeToken<HashMap<String, class>>() {}.getType());
如果你有一个 fileWriter 它会覆盖数据
示例数据:
你好世界
如果你在 0 处写一个 K,它看起来像这样
凯洛世界
推荐阅读
- azure - 使用 powershell Get-AzCosmosDBSqlContainerthroughput 获取 Cosmodb 容器吞吐量
- kubernetes - 在 kubernetes 中打开 chown 或 dac_override 功能时是否存在任何安全问题
- javascript - 如何使用 id 而不是索引来定位按钮?
- java - 如何从具有生成 ID 的抽象类创建子类?
- javascript - 不工作,在 html 中显示 javascript 变量
- python-3.x - 在 anaconda 命令提示符中运行 jupyter notebook 时如何修复“导入 win32api 时 DLL 加载失败”
- c# - 无法弄清楚我做错了什么
- c# - 一种打印实例名称的方法
- javascript - 反应 | 蚂蚁设计选择值未设置
- rasa-core - 成功执行“rasa train”后“rasa shell”给出错误