gpt4 book ai didi

java - 如何在Java中使用Streaming API解析JSON日志文件,然后输出列表日志文件

转载 作者:行者123 更新时间:2023-11-29 05:54:27 26 4
gpt4 key购买 nike

我手头有一个问题,我试图解析以 JSON 格式存储的大型日志文件,然后将数据制成表格并将其输出为另一个 JSON 文件。以下是我正在解析的日志文件的格式:

{
"timestamp": "2012-10-01TO1:00:00.000",
"id": "someone@somewhere.net",
"action": "Some_Action"
"responsecode": "1000"
}

这里的 Action 是某个用户执行的 Action ,响应码是那个 Action 的结果。

timestamp和id其实和我的表格无关,我只对action/code字段感兴趣。在任何给定的日志文件中可能有数以万计的这些条目,我想做的是跟踪所有类型的action'sresponsecode 及其各自的出现次数。

下面是我希望生成的输出示例。

{"actionName": "Some_User_Action",
"responses": [{"code": "1000", "count": "36"},
{"code": "1001", "count": "6"},
{"code": "1002", "count": "3"},
{"code": "1003", "count": "36"},
{"code": "1004", "count": "2"}],
"totalActionCount": "83"}

基本上,对于每个 Action,我想跟踪它生成的所有不同响应,以及每个响应发生的次数。最后,我想跟踪该操作的响应总数。

目前,我已经为输出对象创建了一个 Java 类,我打算在其中存储输出数据。我对存储响应数组及其各自计数的格式也有点困惑。响应代码类型的总数也因操作而异。

根据我的研究,我似乎需要使用 Streaming API 来使用 JSON 解析。使用 Streaming API 的原因主要是因为使用非 Streaming API 需要大量的内存开销,这对于这些日志文件的大小来说可能是不可能的。我目前正在考虑使用 Jackson 或 GS​​ON,但我无法找到任何具体示例或教程来帮助我入门。有谁知道我可以研究的一个很好的例子,或者对我如何解决这个问题有任何提示?谢谢!

编辑:我的类(class)定义。

public class Action {



public static class Response {

private int _resultCode;
private int _count = 0;

public Response() {}

public int getResultCode() { return _resultCode; }
public int getCount() { return _count; }

public void setResultCode(int rc) { _resultCode = rc; }
public void setCount(int c) { _count = c; }

}

private List<Response> responses = new ArrayList<Response>();
private String _name;

// I've left out the getters/setters and helper functions that I will add in after.

}

如果我正在使用 Jackson,并希望最终能够轻松地将此对象序列化回 JSON,是否有关于我如何定义此类的任何建议?目前,我正在使用以下方法在 main() 方法中创建此 Action 类型的另一个 ArrayList: 列表 Action = new ArrayList();使用 HashMaps 或其他替代方案是更好的选择吗?此外,它是否允许我在之后使用 Jackson 轻松地将其序列化为 JSON?

最佳答案

好的,首先,您可以使用 Jackson 将数据绑定(bind)与流式传输相结合。您只需要一个 JsonParser(使用 JsonFactory 创建,其实例可以从 ObjectMapper 获取,或直接构造)。然后您可以将流推进到第一个条目,然后从那里开始使用数据绑定(bind) (ObjectMapper.readValue(...))。这将只读取获取所需单值实例所需的最低限度。

或者更好的是,一旦到达数组,就使用“readValues()”方法

ObjectMapper mapper = new ObjectMapper();
JsonParser jp = mapper.getJsonFactory().createJsonParser(sourceFile);
while (jp.nextToken() != JsonToken.START_ARRAY) { }
MappingIterator<Response> it = mapper.readValues(jp, Entry.class);
while (it.hasNextValue()) {
Response value = it.nextValue();
// process it; keep count, whatever
}

要输出,您可能需要考虑 Jackson CSV module :它可以使用 CSV 变体之一编写条目;您可以根据需要重新定义分隔符。有关示例,请参阅项目自述文件。

关于java - 如何在Java中使用Streaming API解析JSON日志文件,然后输出列表日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12713990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com