【问题标题】:IO.FileStream/JSON options to ignore portions of the file being parsedIO.FileStream/JSON 选项忽略正在解析的文件部分
【发布时间】: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() 来修剪领先的膨胀。在将其传递给JsonTextReader constructor 之前,请忽略上面提到的尾随膨胀。
  • 非常感谢您的想法。将尝试一种混合方法,直接在文件中的结尾膨胀上写入空格(这既简单又快速,解析器应该忽略空格),然后使用你的“ReadLine”将流推进到第一个膨胀之后,这应该允许要通过简单的流读取器正确加载的 JSON 对象。
  • 设置JsonSerializerSettings.CheckAdditionalContent = false 肯定比在文件末尾写空格更容易,不是吗?
  • 是的,开始工作了。最简单的解决方案是“ReadLine”跳过开始 + Serializer.CheckAdditionalContent = false 跳过结束。无需更改文件。再次感谢。不要每天使用 JSON。

标签: .net json.net filestream streamreader


【解决方案1】:

根据@dbc 的说明,这是我为有类似问题的人提供的最终工作对象解析例程。

Using fs As New IO.FileStream(fi.FullName, IO.FileMode.Open, IO.FileAccess.ReadWrite, IO.FileShare.Read)
    Dim enc As Text.Encoding = Text.Encoding.GetEncoding(1252) ' this is "Windows-1252" which is for Extended ANSI character set like ASCII but including (128-255) for accented characters.
    Using sr As New IO.StreamReader(fs, enc)
        sr.ReadLine() ' advance past first line of garbage.
        Using jtr As New Json.JsonTextReader(sr)
            Dim ser As New Json.JsonSerializer
            ser.CheckAdditionalContent = False ' should ignore the bloat after the JSON object ends.
            Return ser.Deserialize(jtr)
        End Using
    End Using
End Using

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多