Linux
Nginx
数据库
Python
PHP
C#
.NET
WPF
MAUI
Blazor
WinForm
帝国CMS
AKCMS
Typecho
织梦CMS
Visual Studio
Windows
Mac
Web前端
数据采集
运营
产品
摩托车
电影
杂事
Newtonsoft是比较老的Json序列化和反序列化API,但是版本并不老,它完美的支持.NET Core以上版本。其实Newtonsoft除了序列化功能,还可以实现LINQ to JSON的功能,也就是不依赖对象(相对),用LINQ的方式直接读取json文本,这样的好处是,动态读取Json的时候如果对象不同字段名称相同就可以不依赖对象了。
1、环境准备
新建一个.NET6项目,安装最新的包Newtonsoft,这里就不再讲述。
.
2、取对象中的一个字段
在通常的方式获取一个Json的字段需要序列号Json后转换成对象(当然也可以有其它方法),为了取一个字段必须对对象依赖。这里用Newtonsoft中的JObject.Parse,一句代码解决。如下
string jsonstr = "{\"Id\":1,\"Name\":\"刘德华\",\"Age\":61}";
//传统思维的做法 转成对象,System.Text.Json
var items = JsonSerializer.Deserialize<Pepole>(jsonstr);
var sel = items.Name;
//LINQ to JSON
JObject items2 = JObject.Parse(jsonstr);
var sel2 = items2["Name"].ToString();
//对象
public class Pepole
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public List<Pepole> Child { get; set; }
}
上面是最简单的用法。还有像写linq一样的用法。
3、取对象中的子集合
还是继续上面的案例,刘德华会有儿女吧,假设刘德华有两个孩子,就是两个子对象,我们用LINQ to JSON获取他两个孩子的姓名和年龄。
string jsonstr = @"{\"Id\":1,\"Name\":\"刘德华\",\"Age\":61,
\"Child\":[{\"Id\":5,\"Name\":\"刘小华\",\"Age\":6},{\"Id\":6,\"Name\":\"刘小德\",\"Age\":12}]}";
JObject items2 = JObject.Parse(jsonstr);
//下面一段代码取出刘德华孩子的姓名和年龄
var sel2 = items2["Child"].Select(s=>new{Name= s["Name"],Age= s["Age"] }).ToList();
//还可以这样来
var sel3 = from p in items2["Child"] select new {Name= (string)p["Name"], Age=(int)p["Age"] };
//sel2结果是个匿名对象集合,是刘德华的两个孩子,sel3同理
如果获取第一个孩子的名字可以使用SelectToken
string name = (string)items2.SelectToken("Child[0].Name");
//name为刘小华
如果刘德华还有孙子,使用SelectToken可以不断向下取出数据,也可以Select和SelectToken嵌套使用。其它API详情请查看官网:
https://www.newtonsoft.com/json/help/html/LINQtoJSON.htm
本文讲述了Newtonsoft的LINQ TO Json基本使用,注意JObject.Parse第一层只支持但单一对象,不支持集合。对于读取Json大家还有啥好的方案,欢迎留言讨论。
本文作者:翔星
信息来源:
公众号 DotNet开发跳槽
所属分类:
C#
上一篇:
浅析C#中单点登录的原理和使用
下一篇:
用C#代码获取文件夹里及子文件夹所有文件名
Power by Typecho. Theme by Puma. Written by 董川民-
独立开发者
渝ICP备16006207号-2
渝公网安备 50011202503233号
友情链接: