使用System.Text.Json修改JSON文件

使用System.Text.Json修改JSON文件,第1张

使用System.Text.Json修改JSON文件

您的问题是您想检索,过滤和传递一些JSON,而无需为该JSON定义完整的数据模型。使用Json.NET,您可以为此使用LINQ to
JSON
。您的问题是,
这目前可以轻松解决

System.Text.Json
吗?

从.NET Core 3.0开始,

System.Text.Json
由于以下原因,此 *** 作无法如此轻松地完成:

  1. Jsondocument
    ,对应于
    JToken
    或的类型
    Xdocument
    为只读。它只能用于 检查 JSON值,不能用于修改或创建JSON值。

当前有一个未解决的问题 Writable Json
DOM#39922对此进行了
跟踪。

  1. System.Text.Json
    不支持JSONPath,这在此类应用程序中通常很方便。

当前存在一个未解决的问题, 将JsonPath支持添加到Jsondocument /
JsonElement#41537,以对此进行
跟踪。

话虽如此,假设您有以下JSON:

[  {    "id": 1,    "name": "name 1",    "address": {      "Line1": "line 1",      "Line2": "line 2"    },    // More properties omitted  }  //, Other array entries omitted]

以及

Predicate<long>shouldSkip
与您的问题
id
相对应的某种过滤方法,该方法指示是否应返回不包含特定条目的条目
CHECKS
。您有什么选择?

您可以使用

Jsondocument
并返回一些经过过滤的
JsonElement
节点集
。如果过滤逻辑非常简单,并且您不需要以任何其他方式修改JSON,则这很有意义。注意,
Jsondocument
是一次性的,并且实际上必须需要被设置为
最小化在高的使用场景的垃圾收集器(GC)的影响 ,根据该文档。因此,为了返回a,
JsonElement
您必须对其进行克隆。

以下代码显示了此示例:

using var usersdocument = Jsondocument.Parse(rawJsonDownload);var users = usersdocument.RootElement.EnumerateArray()    .Where(e => !shouldSkip(e.GetProperty("id").GetInt64()))    .Select(e => e.Clone())    .ToList();return Json(users);

样机小提琴#1 在这里。

您可以创建一个 部分
数据模型,该模型仅反序列化过滤所需的属性,而其余JSON绑定到一个

[JsonExtensionDataAttribute]
属性。
这应该使您无需硬编码整个数据模型即可实施必要的过滤。

为此,请定义以下模型:

public class UserObject{    [JsonPropertyName("id")]    public long Id { get; set; }    [System.Text.Json.Serialization.JsonExtensionDataAttribute]    public IDictionary<string, object> ExtensionData { get; set; }}

并反序列化和过滤如下:

var users = JsonSerializer.Deserialize<List<UserObject>>(rawJsonDownload);users.RemoveAll(u => shouldSkip(u.Id));return Json(users);

这种方法确保了与过滤相关的属性可以适当地反序列化,而无需对JSON的其余部分做任何假设。尽管这并不像使用LINQ to
JSON那样容易,但是总代码复杂度受筛选检查的复杂度限制,而不是JSON的复杂度。实际上,我的观点是,实际上,这种方法比纯

Jsondocument
方法更容易使用,因为如果以后需要,它可以更轻松地注入对JSON的修改。

样机小提琴#2 在这里。

没有你选择事情 ,你可能会考虑抛弃

WebClient
HttpClient
,并使用
async
反序列化。例如:

var httpClient = new HttpClient();using var usersdocument = await Jsondocument.ParseAsync(await httpClient.GetStreamAsync("WEB API CALL"));

要么

var users = await JsonSerializer.DeserializeAsync<List<UserObject>>(await httpClient.GetStreamAsync("WEB API CALL"));

您还需要将您的API方法转换

async
为。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5031055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存