C#中System.Text.Json匿名对象反序列化.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

C#中System.Text.Json匿名对象反序列化

目录数据自定义类匿名方式动态方式参考以前就是一直使用Newtonsoft.Json用起来还是挺舒服的。由于JSON的应用越来越广,现在.NETCore都内置了System.Text.Json可以直接对JSON进行操作,不过两个东西的体验依然有点区别。

有时候我们会遇到的从第三方传递过来的jsonstring对象,对其进行解析并不需要所有的字段,只需要一个目标的字段时,可以考虑使用匿名对象/动态对象对其反序列化。

之前的Newtonsoft.Json好像直接使用dynamic,运用JObject进行处理,现在的不是那么容易。下文代码基于.NET6,为了代码整洁,实际配置了PropertyNameCaseInsensitive=true,但是下面代码中并没有体现。

数据

我们定义了如下的类型,并从OData获得了str字符串型数据。

publicreadonlystaticstringstr=

{@odata.context:http://localhost:9000/api/v1/$metadata#DataDto,value:[{id:0b734ed7-2955-4af4-a902-35dtimestamp:1684839865920},{id:7e285d08-cdb3-4209-8335-0ff9b20d39ef,timestamp:1684836312421}]}

;

publicclassDataDto

publicstringId{get;set;}

publiclongTimestamp{get;set;}

}

由于有元数据,我们无法直接将上面的字符串反序列化为DataDto的列表对象。

自定义类

最简单的方式,是对应此类对象,设计一个只用于反序列化的新类。

publicclassODataEnumerableResultWrapperT

whereT:class

publicIEnumerableTValue{get;set;}

varmeta=JsonSerializer.DeserializeODataEnumerableResultWrapperDataDto(str);

vartarget=meta.Value;

匿名方式

可以使用JsonNode来直接反序列化,并使用类似键值对的形式访问。

publicstaticvoidMain(){

JsonNodemeta=JsonSerializer.DeserializeJsonNode(str);

//如果直接是简单的对象,而不是数组,可以使用GetValueT这种形式。

varcount=meta[value].DeserializeIEnumerableDataDto().Count();

Console.WriteLine(count);

}

注意,这样的操作和你反序列化为JsonDocument/JsonElement并没有什么本质的区别。

动态方式

由于设计区别,直接使用dynamic进行反序列化,得到的对象并不具有一般dynamic的性质(实际上是System.Text.Json.JsonElement对象)。因此,我们无法通过的dynamic访问成员的形式进行操作。

dynamicmeta=JsonSerializer.Deserializedynamic(str);

Console.WriteLine(meta.GetType());

//OUTPUT:System.Text.Json.JsonElement

有文章说可以使用ExpandoOject实现,但是实际上无法对子级对象进行类似的访问,因为获取的子级对象,实际上是JsonElement。

dynamicmeta=JsonSerializer.DeserializeSystem.Dynamic.ExpandoObject(str);

Console.WriteLine(meta.GetType());

//System.Dynamic.ExpandoObject

Console.WriteLine(meta.value);

//[{id:0b734ed7-2955

文档评论(0)

132****1508 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档