我的主要目标是从JSON文件中获取信息并在内存中进行操作(试图解决内存中的语法问题)。然后,使用com.google.gson.JsonParser将操纵值解析为一个对象,并保留旧文件的开头位置(包括语法错误)。
我设法使用RandomAccessFile操作该文件,然后使用“ new 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": ""
}
}
基本上,我需要在文件的开头/结尾处添加“ [”和“]”以解决语法问题。
答案 0 :(得分:1)
json不会以任何方式融合,它只是像Map<String, Objekt>
和TypeToken
这样的地图可能会帮助您解决问题:
gson.fromJson(reader, new TypeToken<HashMap<String, class>>() {}.getType());
如果您有fileWriter,它将覆盖数据
示例数据:
你好世界
如果您在0处写一个K,它将看起来像这样
凯洛世界