我正在使用NewtonSoft.Json包。
我需要解析一个包含大型base64编码数据块的JSON文件。 一个base64元素可能是33 mb,文件将包含其中的30个。
数据可能看起来像这样(简化):
{
"header": { "some_id": "foo", "other-data": 123},
"measurements": [
{
"info": {"unit": "m/s2","channel": "ch1"},
"data": "coUhRR.. 33 mb base64 data here ...=="
},
{
"info": { "unit": "m/s", "channel": "ch2"}
"data": "MxaDF.. 33 mb base64 data here ...=="
}, ...
]
}
我想将base64字节输出到单独的文件,最好使用 CryptoStream和ToBase64Transform将json值转换为字节。
我的问题是JsonTextReader保留了一个内部字符数组_chars。 这变得非常大。每当需要读取字符串值时,_chars的大小就会加倍,从1024个字符开始。因此,如果我正在读取33 mb base64元素,则_chars将增长到6400万个字符,占用128 mb内存。而且在JsonTextReader的整个生命周期中都不会再次缩小。
在更高版本中,我们很可能甚至需要处理大型json文件。
如何解决此问题?我假设我必须以某种方式扩展JsonTextReader,但是覆盖什么并不清楚?
一种替代方法是编写一个TextReader包装器,该包装器将上述数据转换为更短的流,同时将base64数据路由到文件? 因此,它将对流进行简单的即时解析并进行转换
"data": "coUhRR.. 33 mb base64 data here ...=="
到
"data": "file:tempfile_xxx.bin"
,同时将解码后的数据写入tempfile_xxx.bin。但是然后我需要使用一些巧妙的黑魔法来检测正确的地方来修改流吗?
我是否忽略了一些明显的解决方案? 是否有替代解析器,在这种情况下会更好?