【发布时间】:2022-02-02 00:23:27
【问题描述】:
我有一个案例,我收到了一个包含 JSON 数据的大文件。 不幸的是,它在文件开头有一小行开销字符串数据,在文件末尾有另一行开销字符串数据。 我之前是手动将文件数据读入一个字符串,并在内存中删除这些数据,但是大小已经变得如此之大,我无法再这样做了。
我现在需要使用从流中读取的 JSON 对象反序列化器,但由于这种臃肿的开销数据,这将失败。
所以我需要删除这个“膨胀”。
我的一个选择是简单地重写文件,排除膨胀,然后使用新文件。但是文件现在 > 1.5GB,这将增加开销。
第二个选项可能是创建一个继承的 FileStream 类,该类可以隐藏这种膨胀,有效地从流中删除不良开销数据,同时仍将剩余数据流式传输到 JSON 反序列化器(这看起来很复杂且烦人)。
在我采取这些烦人的选择之一之前,有没有一种简单的方法可以做到这一点?
示例文件数据...
HDR ZREOF100B 013 20220129 084455
{
"CUSTOMER_DATA": [
... allot of JSON data ...
]
}
TRL ZREOF100B 551
第一行和最后一行基本上是我所指的“膨胀”。
【问题讨论】:
-
您可以将this answer 修改为How to deserialize a JSONP response (preferably with JsonTextReader and not a string)? 以跳过直到您遇到
{,它们会根据Discarding garbage characters after json object with Json.Net 忽略尾随垃圾。这是否回答你的问题?丢弃尾随“膨胀”是由 Json.NET 实现的,但从您的问题中不清楚您究竟如何描述领先的“膨胀”。 -
第一行和最后一行基本上是我所指的“膨胀”。 -- 如果是这样,您可以创建一个
StreamReader并执行streamReader.ReadLine()来修剪领先的膨胀。在将其传递给JsonTextReaderconstructor 之前,请忽略上面提到的尾随膨胀。 -
非常感谢您的想法。将尝试一种混合方法,直接在文件中的结尾膨胀上写入空格(这既简单又快速,解析器应该忽略空格),然后使用你的“ReadLine”将流推进到第一个膨胀之后,这应该允许要通过简单的流读取器正确加载的 JSON 对象。
-
设置
JsonSerializerSettings.CheckAdditionalContent = false肯定比在文件末尾写空格更容易,不是吗? -
是的,开始工作了。最简单的解决方案是“ReadLine”跳过开始 + Serializer.CheckAdditionalContent = false 跳过结束。无需更改文件。再次感谢。不要每天使用 JSON。
标签: .net json.net filestream streamreader