这是我为自己的解析器/反序列化器考虑的用例之一。
我最近做了一个反序列化这个 JSON 形状的简单示例(通过向解析器提供通过 StreamReader 读取的 JSON 文本):
{
"fathers" : [
{
"id" : 0,
"married" : true,
"name" : "John Lee",
"sons" : [
{
"age" : 15,
"name" : "Ronald"
}
],
"daughters" : [
{
"age" : 7,
"name" : "Amy"
},
{
"age" : 29,
"name" : "Carol"
},
{
"age" : 14,
"name" : "Barbara"
}
]
},
{
"id" : 1,
"married" : false,
"name" : "Kenneth Gonzalez",
"sons" : [
],
"daughters" : [
]
},
{
"id" : 2,
"married" : false,
"name" : "Larry Lee",
"sons" : [
{
"age" : 4,
"name" : "Anthony"
},
{
"age" : 2,
"name" : "Donald"
}
],
"daughters" : [
{
"age" : 7,
"name" : "Elizabeth"
},
{
"age" : 15,
"name" : "Betty"
}
]
},
//(... etc)
]
}
...进入这些 POCO:
https://github.com/ysharplanguage/FastJsonParser#POCOs
(即,具体而言:“FathersData”、“Father”、“Son”、“Daughter”)
该示例还显示:
(1) 在 Father[] 数组中的相对项索引上的示例过滤器(例如,仅获取前 10 个),以及
(2) 如何动态填充父亲女儿的属性,因为他们各自的父亲的反序列化返回 - (也就是说,由于调用者传递给解析器的 Parse 方法的委托,用于回调目的)。
有关其余位,请参见:
ParserTests.cs : 静态无效 FilteredFatherStreamTestDaughterMaidenNamesFixup()
(第#829到#904行)
我在我不起眼的笔记本电脑 (*) 上观察到的性能,用于解析大约 12MB 到 180MB 的 JSON 文件并将其内容的任意子集反序列化为 POCO
(或松散类型的字典(仅(字符串,对象)键/值对)也支持)
在大约 20MB/秒到 40MB/秒 (**) 的任何地方。
(例如,在 12MB JSON 文件的情况下,大约 300 毫秒进入 POCO)
此处提供更多详细信息:
https://github.com/ysharplanguage/FastJsonParser#Performance
'HTH,
(*) (运行 Win7 64bit @ 2.5Ghz)
(**)(吞吐量很大程度上取决于输入 JSON 的形状/复杂性,例如,子对象嵌套深度和其他因素)