例如,我有一个包含对象的大文件。
我需要检查是否有任何对象包含城市名称。
using (FileStream fs = new FileStream("city.list.json", FileMode.Open))
{
var citys = await JsonSerializer.DeserializeAsync<List<City>>(fs);
var result = citys.Where(x => x.name == city).FirstOrDefault();
if (result != null)
{
return true;
}
else
{
return false;
}
}
例如,如何上传 1000 个对象,如果没有找到,则下载接下来的 1000 个对象?
或者我可以以某种方式设置内存限制,例如 10 MB?
我对 System.Text.Json* 的猛攻没有成功,所以这里有一个在 Newtonsoft.Json 上为您提供的解决方案。
主要技巧是:一方面,您不能通读
JsonConvert
orJsonSerializer.Deserialize
,因为这会将整个文件读入内存。另一方面,通过读取一个令牌JsonTextReader
也是不情愿的,因为您必须对每条记录进行太多详细的解析,并且几乎要手动进行反序列化。所以我选择了一个综合解决方案。
JsonSerializer
可以从'a中读取部分数据JsonTextReader
,这意味着它可以被要求从列表中只读取一个城市。因此,可以组织一个懒惰的城市序列。诚然,我们将不得不通过令牌读取数组的开头和结尾,但这是为节省内存付出的小代价。
我们的令牌将如下所示:
于是,得到如下代码:
您可以使用的一切:
*此示例显示如何“手动”从文件中读取,交错读取
Utf8JsonReader
并重新创建此文件Utf8JsonReader
,但我无法自动执行此操作以读取任意对象。但是,有一个 github ticket谈到了这一点。Utf8JsonReader
并且可以像在@Alexander Petrov 的远程答案中那样读取对象:var city = JsonSerializer.Deserialize<City>(ref reader);
.