【发布时间】:2016-09-16 07:01:23
【问题描述】:
我有一个 JSON 字符串,如下所示:
{"Detail": [
{"PrimaryKey":111,"Date":"2016-09-01","Version":"7","Count":2,"Name":"Windows","LastAccessTime":"2016-05-25T21:49:52.36Z"},
{"PrimaryKey":222,"Date":"2016-09-02","Version":"8","Count":2,"Name":"Windows","LastAccessTime":"2016-07-25T21:49:52.36Z"},
{"PrimaryKey":333,"Date":"2016-09-03","Version":"9","Count":3,"Name":"iOS","LastAccessTime":"2016-08-22T21:49:52.36Z"},
.....( *many values )
]}
数组Detail 有很多PrimaryKeys。有时,大约是 500K PrimaryKeys。我们使用的系统只能处理一定长度的 JSON 字符串,即 128KB。所以我必须将这个 JSON 字符串分割成段(每个段的长度为 128KB 或更少的字符)。
Regex reg = new Regex(@"\{"".{0," + (128*1024).ToString() + @"}""\}");
MatchCollection mc = reg.Matches(myListString);
目前,我使用正则表达式来执行此操作。它工作正常。但是,它使用了太多的内存。有没有更好的方法来做到这一点(不必是正则表达式)?
*** 添加了更多信息。
我上面提到的“系统”是 Azure DocumentDB。默认情况下,文档只能是 512KB(和现在一样)。虽然我们可以要求 MS 增加这个,但是我们得到的 json 文件总是远远超过 512KB。这就是为什么我们需要想办法做到这一点。
如果可能,我们希望继续使用 documentDB,但我们愿意接受其他建议。
*** 一些信息让事情变得清晰:1)数组中的值不同。不重复。 2) 是的,我尽可能使用 StringBuilder。 3) 是的,我试过IndexOf & Substring,但是根据测试,这种情况下性能并不比正则表达式好(虽然可能是我实现的方式)。
* **json 对象很复杂,但我只关心这个“详细信息”,它是一个数组。我们可以假设字符串就像示例一样,只有“详细信息”。我们需要将这个 json 数组字符串拆分成小于 512KB 的大小。基本上,我们可以认为这是一个简单的字符串,而不是 json。但是,它是 json 格式,所以也许有些库可以做得更好。
【问题讨论】:
-
什么系统? (我们使用的系统只能处理一定长度的json字符串,即128KB)
-
您基本上必须将您的 json 重写为长度更短的有效 json,或者您所说的“系统”是自制软件并且并不关心它是否是有效的 json?为什么不看看 json.net 或没有这种限制的东西?
-
如果您知道数据的确切格式并且不关心在格式更改时破坏解析代码,我认为
IndexOf和Substring可以解决问题。 -
嗯,你有 3 行 duplicated 数据。如果您将 one 行改为 Key
"PrimaryKey":null,"Date":"2016-09-06","Version":"7","Count":2,"Name":"Windows",并将日期数组或集合作为 Value -
@Fabjan,你是认真的吗?很明显,JSON 对象在生产中会有所不同。 OP 显然只是复制并粘贴同一行以作为示例。
标签: c# .net json azure azure-cosmosdb