C#使用Newtonsoft直接读取Json格式文本(Linq to Json)

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.Jsonvar items = JsonSerializer.Deserialize<Pepole>(jsonstr);var sel = items.Name; //LINQ to JSONJObject 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大家还有啥好的方案,欢迎留言讨论。