到目前为止我一直使用Json.NET的"JsonConvert.Deserialize(json)"方法,这个方法非常好用,老实说,我不需要比这更多的东西。
我正在开发一个后台(控制台)应用程序,该应用程序不断从不同的URL下载JSON内容,然后将结果反序列化为.NET对象列表。
using (WebClient client = new WebClient())
{
string json = client.DownloadString(stringUrl);
var result = JsonConvert.DeserializeObject<List<Contact>>(json);
}
上面的简单代码片段可能看起来并不完美,但它完成了工作。当文件很大(15,000个联系人 - 48 MB文件)时,JsonConvert.DeserializeObject不是解决方案,该行会抛出JsonReaderException异常类型。
下载的JSON内容是一个数组,这是样本的外观。Contact是反序列化JSON对象的容器类。
[
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
}
]
我的初步猜测是它运行时内存不足。出于好奇,我试图将其解析为JArray,结果也导致了同样的异常。
我已经开始深入研究Json.NET文档并阅读类似的主题讨论。由于我尚未成功地找到解决方案,所以我决定在这里发布一个问题。
更新:逐行反序列化时,我得到了相同的错误:“[. Path',第600003行,位置1。”因此我下载了其中两个并在Notepad++中检查了它们。我注意到,如果数组长度超过12,000,在第12000个元素之后,“[”就会关闭,另一个数组就会开始。换句话说,JSON看起来像这样:
[
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
}
]
[
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
},
{
"firstname": "sometext",
"lastname": "sometext"
}
]