C# 通过Dynamic访问System.Text.Json对象

网友投稿 1088 2022-11-19

C# 通过Dynamic访问System.Text.Json对象

C# 通过Dynamic访问System.Text.Json对象

有时在处理Http请求的时候,偷懒不想定义一个Model来处理,使用Dynamic来直接操作请求的数据是非常方便的

C#中dynamic关键字

dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能。

什么是"动态"

dynamic、object还是var?

那么,dynamic、Object和var之间的实际区别是什么?何时使用它们?

dynamic d1 = 7;dynamic d2 = "a string";dynamic d3 = System.DateTime.Today;dynamic d4 = System.Diagnostics.Process.GetProcesses();

反之亦然,类型为dynamic的任何表达式也能够隐式转换为其他类型。

int i = d1;string str = d2;DateTime dt = d3;System.Diagnostics.Process[] procs = d4;

前面整理过一篇关于dynamic类型与Newtonsoft.Json来操作请求的数据,请参考如下文章

C# Dynamic与Newtonsoft.Json的应用

参考Nettonsoft.Json中的访问,同样定义一个JTextAccessor,代码如下

dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。但如果没有,要访问Json里面对应的数据的时候,就显得比较麻烦。再根据Asp.Net Core WebAPI中的FromBody传递内容就是一个JsonElement,我们可以借助DynamicObject来方便的访问对应的属性。

public class JTextAccessor : DynamicObject{ private readonly JsonElement _content; public JTextAccessor(JsonElement content) { _content = content; } public override bool TryGetMember(GetMemberBinder binder, out object? result) { result = null; if (_content.TryGetProperty(binder.Name, out JsonElement value)) { result = Obtain(value); } else return false; return true; } private object? Obtain(in JsonElement element) { switch (element.ValueKind) { case JsonValueKind.String: return element.GetString(); case JsonValueKind.Null: return null; case JsonValueKind.False: return false; case JsonValueKind.True: return true; case JsonValueKind.Number: return element.GetDouble(); default: break; } if (element.ValueKind == JsonValueKind.Array) { var list = new List(); foreach (var item in element.EnumerateArray()) { list.Add(Obtain(item)); } return list; } // Undefine、Object else return new JTextAccessor(element); }}

编写一个Controller来验证

[HttpPost]public IActionResult Post([FromBody] dynamic value){ dynamic ja = new JTextAccessor(value); string Name = ja.Name; int Age = (int)ja.Age; var list = ja.List; string childName = list[0].Name; string str = JsonSerializer.Serialize(value); _logger.LogInformation(str); return Ok(new { code = "0", message = "成功", reqCode = "" });}

设置好断点,调试

调试断点

调试断点

使用postman做请求测试

postman做请求测试

查看调试的结果非常理想,成功偷懒省了事

查看调试的结果

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅谈SpringBoot中的Bean初始化方法 @PostConstruct
下一篇:Docker Swarm 快速入门
相关文章

 发表评论

暂时没有评论,来抢沙发吧~