从大文件中读取JSON对象
我正在寻找一个JSON Parser,它允许我从大型JSON文件(大小几百MB)中迭代JSON对象。 我从Json.NET尝试过JsonTextReader,如下所示:
JsonTextReader reader = new JsonTextReader(new StringReader(json)); while (reader.Read()) { if (reader.Value != null) Console.WriteLine("Token: {0}, Value: {1}", reader.TokenType, reader.Value); else Console.WriteLine("Token: {0}", reader.TokenType); }
但它会在令牌之后返回令牌。
如果我需要整个对象而不是令牌,有没有更简单的方法?
假设你有一个类似于这的json数组:
[{"text":"0"},{"text":"1"}......]
我将为对象类型声明一个类
public class TempClass { public string text; }
现在,反序列化部分
JsonSerializer ser = new JsonSerializer(); ser.Converters.Add(new DummyConverter(t => { //A callback method Console.WriteLine(t.text); })); ser.Deserialize(new JsonTextReader(new StreamReader(File.OpenRead(fName))), typeof(List ));
还有一个虚拟的JsonConverter类来拦截反序列化
public class DummyConverter : JsonConverter { Action _action = null; public DummyConverter(Action action) { _action = action; } public override bool CanConvert(Type objectType) { return objectType == typeof(TempClass); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { serializer.Converters.Remove(this); T item = serializer.Deserialize (reader); _action( item); return null; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } }
我会使用这个库JSON.net 。 Nuget的命令如下 – > Install-Package Newtonsoft.Json
这是我为自己的解析器/解串器设想的用例之一。
我最近做了一个简单的例子(通过向解析器提供通过StreamReader读取的JSON文本)反序列化这个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
(具体来说:“父亲数据”,“父亲”,“儿子”,“女儿”)
该样本还提出:
(1)在Father []数组中的相对项索引上的样本filter(例如,仅获取前10个),以及
(2)如何动态填充父亲的女儿的属性,因为他们各自父亲的反序列化返回 – (这要归功于调用者传递给解析器的Parse方法的委托,用于回调目的)。
对于其余位,请参阅:
ParserTests.cs:static void 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形状/复杂度,例如,子对象嵌套深度和其他因素)
上述就是C#学习教程:从大文件中读取JSON对象分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1016913.html