文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#中的Linq to JSON操作实例分析

2023-06-30 18:35

关注

今天小编给大家分享一下C#中的Linq to JSON操作实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Linq to JSON是用来操作JSON对象的,可以用于快速查询、修改和创建JSON对象。

当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和修改部分的数据而非反序列化全部。

在进行Linq to JSON之前,首先要了解一下用于操作Linq to JSON的类.

类名说明
JObject用于操作JSON对象
JArray用语操作JSON数组
JValue表示数组中的值
JProperty表示对象中的属性,以"key/value"形式
JToken用于存放Linq to JSON查询后的结果

一、创建JObject and JArrary实例

1、手动创建JSON

设置值和一次创建一个对象或数组可以让您完全控制,但是它比其他选项更冗长。

1、创建JSON对象,JObject
JObject staff = new JObject();staff.Add(new JProperty("Name", "Jack"));staff.Add(new JProperty("Age", 33));staff.Add(new JProperty("Department", "Personnel Department"));staff.Add(new JProperty("Leader", new JObject(new JProperty("Name", "Tom"), new JProperty("Age", 44), new JProperty("Department", "Personnel Department"))));Console.WriteLine(staff.ToString());//返回//{//  "Name": "Jack",//  "Age": 33,//  "Department": "Personnel Department",//  "Leader": {//    "Name": "Tom",//    "Age": 44,//    "Department": "Personnel Department"//  }//}
2、创建JSON数组,JArrary
JArray arr = new JArray();arr.Add(new JValue(1));arr.Add(new JValue(2));arr.Add(new JValue(3));Console.WriteLine(arr.ToString());//返回//[//  1,//  2,//  3//]

2、使用Linq创建JSON

使用LINQ声明式地创建JSON对象,是一种从值集合创建JSON的快速方法。

List posts = GetPosts();JObject rss =    new JObject(        new JProperty("channel",            new JObject(                new JProperty("title", "James Newton-King"),                new JProperty("link", "http://james.newtonking.com"),                new JProperty("description", "James Newton-King's blog."),                new JProperty("item",                    new JArray(                        from p in posts                        orderby p.Title                        select new JObject(                            new JProperty("title", p.Title),                            new JProperty("description", p.Description),                            new JProperty("link", p.Link),                            new JProperty("category",                                new JArray(                                    from c in p.Categories                                    select new JValue(c)))))))));Console.WriteLine(rss.ToString());//{//  "channel": {//    "title": "James Newton-King",//    "link": "http://james.newtonking.com",//    "description": "James Newton-King\'s blog.",//    "item": [//      {//        "title": "Json.NET 1.3 + New license + Now on CodePlex",//        "description": "Announcing the release of Json.NET 1.3, the MIT license and being available on CodePlex",//        "link": "http://james.newtonking.com/projects/json-net.aspx",//        "category": [//          "Json.NET",//          "CodePlex"//        ]//      },//      {//        "title": "LINQ to JSON beta",//        "description": "Announcing LINQ to JSON",//        "link": "http://james.newtonking.com/projects/json-net.aspx",//        "category": [//          "Json.NET",//          "LINQ"//        ]//      }//    ]//  }//}

3、从对象创建JSON

JObject.FromObject(object o):o为要转化的对象,返回一个JObject对象

最后一个选项是使用FromObject()方法从非JSON类型创建JSON对象。

下面的示例展示了如何从匿名对象创建JSON对象,但是任何. net类型都可以与FromObject一起创建JSON。

var posts = new[] {     new {        Title="Json.NET 1.3 + New license + Now on CodePlex",        Description= "Announcing the release of Json.NET 1.3, the MIT license and being available on CodePlex",        Link="http://james.newtonking.com/projects/json-net.aspx",        Categories=new[]{ "Json.NET","CodePlex"}    },     new {        Title="LINQ to JSON beta",        Description= "Announcing LINQ to JSON",        Link="http://james.newtonking.com/projects/json-net.aspx",        Categories=new[]{ "Json.NET","LINQ"}    },};JObject o = JObject.FromObject(new{    channel = new    {        title = "James Newton-King",        link = "http://james.newtonking.com",        description = "James Newton-King's blog.",        item =  //返回数组        from p in posts        orderby p.Title        select new           {            title = p.Title,            description = p.Description,            link = p.Link,            category = p.Categories        }    }});Console.WriteLine(o.ToString());//{//  "channel": {//    "title": "James Newton-King",//    "link": "http://james.newtonking.com",//    "description": "James Newton-King\'s blog.",//    "item": [//      {//        "title": "Json.NET 1.3 + New license + Now on CodePlex",//        "description": "Announcing the release of Json.NET 1.3, the MIT license and being available on CodePlex",//        "link": "http://james.newtonking.com/projects/json-net.aspx",//        "category": [//          "Json.NET",//          "CodePlex"//        ]//      },//      {//        "title": "LINQ to JSON beta",//        "description": "Announcing LINQ to JSON",//        "link": "http://james.newtonking.com/projects/json-net.aspx",//        "category": [//          "Json.NET",//          "LINQ"//        ]//      }//    ]//  }//}

4、解析JSON文本

JObject.Parse(string json):json含有JSON对象的字符串,返回为JObject对象

//解析JSON对象string json = @"{  CPU: 'Intel',  Drives: [    'DVD read/writer',    '500 gigabyte hard drive'  ]}";JObject o = JObject.Parse(json);//解析JSON数组string json = @"[  'Small',  'Medium',  'Large']";JArray a = JArray.Parse(json);

5、从文件中加载JSON

using (StreamReader reader = File.OpenText(@"c:\person.json")){    JObject o = (JObject)JToken.ReadFrom(new JsonTextReader(reader));    // do stuff}

二、使用JsonConvert.DeserializeObject反序列化JOSN片段

1、数组数据

string jsonArrayText= "[{'a','al'.'b','b1'},{'a','a2'.'b','b2'}]";JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText); string ja1a==ja[1]["a"].ToString(); //或者 JObject o=(JObject)ja[1]; string ja1a=o["a"].ToString();

2、对象格式

siring jsonText= "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}";JObject jo =(JObject)JsonConvert.DeserializeObject(jsonArrayText);string zone =jo["beijing"]["zone"].ToString();

三、修改JObject and JArrary实例

string json = @"{                   'post':{                       'Title':'修改JArray和JObject',                       'Link':'http://write.blog.csdn.net',                       'Description':'这是一个修改JArray和JObject的演示案例',                       'Item':[]                   }               }";JObject o = JObject.Parse(json);JObject post = (JObject)o["post"];post["Title"] = ((string)post["Title"]).ToUpper();post["Link"] = ((string)post["Link"]).ToUpper();post.Property("Description").Remove();post.Property("Link").AddAfterSelf(new JProperty("New", "新添加的属性"));JArray a = (JArray)post["Item"];a.Add("修改JArray");a.Add("修改JObject");

移除属性

JObject jObj = JObject.Parse(json);jObj.Remove("Colleagues");//跟的是属性名称Console.WriteLine(jObj.ToString());

四、查询JObject and JArrary实例

将一个值从LINQ转换为JSON的最简单方法是:使用JObject/JArray上的ItemObject索引,然后将返回的JValue转换为所需的类型。

string json = @"{  'channel': {    'title': 'James Newton-King',    'link': 'http://james.newtonking.com',    'description': 'James Newton-King\'s blog.',    'item': [      {        'title': 'Json.NET 1.3 + New license + Now on CodePlex',        'description': 'Announcing the release of Json.NET 1.3, the MIT license and the source on CodePlex',        'link': 'http://james.newtonking.com/projects/json-net.aspx',        'categories': [          'Json.NET',          'CodePlex'        ]      },      {        'title': 'LINQ to JSON beta',        'description': 'Announcing LINQ to JSON',        'link': 'http://james.newtonking.com/projects/json-net.aspx',        'categories': [          'Json.NET',          'LINQ'        ]      }    ]  }}";JObject rss = JObject.Parse(json);string rssTitle = (string)rss["channel"]["title"];// James Newton-Kingstring itemTitle = (string)rss["channel"]["item"][0]["title"];// Json.NET 1.3 + New license + Now on CodePlexJArray categories = (JArray)rss["channel"]["item"][0]["categories"];// ["Json.NET", "CodePlex"]IList<string> categoriesText = categories.Select(c => (string)c).ToList();// Json.NET// CodePlex

判断Key是否存在

JToken test = new JObject();if (test["a"] == null){    Console.WriteLine("键值key不存在!");}JObject test1 = test as JObject;if (test1.Property("a") == null || test1.Property("a").ToString() == ""){    Console.WriteLine("键值key不存在!");}

五、用LINQ表达式进行查询

也可以使用LINQ查询JObject/JArray。

Children()以IEnumerable的形式返回JObject/JArray的子值,然后可以使用标准的Where/OrderBy/Select LINQ操作符查询这些子值。

注意:

Children()返回token的所有子元素。如果它是一个JObject,它将返回一个要使用的属性集合,如果它是一个JArray,您将得到一个数组值的集合。

var postTitles =    from p in rss["channel"]["item"]    select (string)p["title"];foreach (var item in postTitles){    Console.WriteLine(item);}//LINQ to JSON beta//Json.NET 1.3 + New license + Now on CodePlexvar categories =    from c in rss["channel"]["item"].SelectMany(i =&gt; i["categories"]).Values&lt;string&gt;()    group c by c    into g    orderby g.Count() descending    select new { Category = g.Key, Count = g.Count() };foreach (var c in categories){    Console.WriteLine(c.Category + " - Count: " + c.Count);}//Json.NET - Count: 2//LINQ - Count: 1//CodePlex - Count: 1

可以使用LINQ to JSON手动将JSON转换为. net对象。

当您处理与. net对象不匹配的JSON时,手动序列化和反序列化. net对象是很有用的。

string jsonText = @"{  'short': {    'original': 'http://www.foo.com/',    'short': 'krehqk',    'error': {      'code': 0,      'msg': 'No action taken'    }  }}";JObject json = JObject.Parse(jsonText);Shortie shortie = new Shortie{    Original = (string)json["short"]["original"],    Short = (string)json["short"]["short"],    Error = new ShortieException    {        Code = (int)json["short"]["error"]["code"],        ErrorMessage = (string)json["short"]["error"]["msg"]    }};Console.WriteLine(shortie.Original);// http://www.foo.com/Console.WriteLine(shortie.Error.ErrorMessage);// No action takenpublic class Shortie{    public string Original { get; set; }    public string Shortened { get; set; }    public string Short { get; set; }    public ShortieException Error { get; set; }}public class ShortieException{    public int Code { get; set; }    public string ErrorMessage { get; set; }}

六、使用函数SelectToken生成JToken对象可以简化查询语句

1、SelectToken

SelectToken是JToken上的一个方法,它将字符串路径作为子Token名,返回子Token。如果在路径的位置找不到Token,则SelectToken返回空引用。

该路径由属性名和按句点分隔的数组索引组成,例如manufacturer [0]. name。

JObject jObj = JObject.Parse(json);JToken name = jObj.SelectToken("Name");Console.WriteLine(name.ToString());

结果:Jack

2、使用LINQ来SelectToken

SelectToken支持JSONPath查询。点击这里了解更多关于JSONPath的信息。

查询最后一名同事的年龄

//将json转换为JObjectJObject jObj = JObject.Parse(json);var age = jObj.SelectToken("Colleagues[1].Age");Console.WriteLine(age.ToString());// manufacturer with the name 'Acme Co'JToken acme = o.SelectToken("$.Manufacturers[?(@.Name == 'Acme Co')]");Console.WriteLine(acme);// { "Name": "Acme Co", Products: [{ "Name": "Anvil", "Price": 50 }] }// name of all products priced 50 and aboveIEnumerable pricyProducts = o.SelectTokens("$..Products[?(@.Price >= 50)].Name");foreach (JToken item in pricyProducts){    Console.WriteLine(item);}// Anvil// Elbow Grease

结果:29

3、使用JSONPath来SelectToken

SelectToken可以与标准的LINQ方法结合使用。

利用SelectToken来查询所有同事的名字

JObject jObj = JObject.Parse(json);var names = jObj.SelectToken("Colleagues").Select(p => p["Name"]).ToList();foreach (var name in names)    Console.WriteLine(name.ToString());IList<string> storeNames = o.SelectToken("Stores").Select(s => (string)s).ToList();// Lambton Quay// Willis StreetIList<string> firstProductNames = o["Manufacturers"].Select(m => (string)m.SelectToken("Products[1].Name")).ToList();// null// Headlight Fluiddecimal totalPrice = o["Manufacturers"].Sum(m => (decimal)m.SelectToken("Products[0].Price"));

结果:Tom Abel

七、如果Json中的Key是变化的但是结构不变,如何获取所要的内容?

例如:

{    "trends": {        "2013-05-31 14:31": [            {                "name": "我不是谁的偶像",                "query": "我不是谁的偶像",                "amount": "65172",                "delta": "1596"            },            {                "name": "世界无烟日",                "query": "世界无烟日",                "amount": "33548",                "delta": "1105"            }        ]    },    "as_of": 1369981898}

其中的"2013-05-31 14:31"是变化的key,如何获取其中的"name","query","amount","delta"等信息呢?
通过Linq可以很简单地做到:

var jObj = JObject.Parse(jsonString);var tends = from c in jObj.First.First.First.First.Children()            select JsonConvert.DeserializeObject(c.ToString());public class Trend{    public string Name { get; set; }    public string Query { get; set; }    public string Amount { get; set; }    public string Delta { get; set; }}

八、综合实例

void Main(){    string json = "{\"Name\" : \"Jack\", \"Age\" : 34, \"Colleagues\" : [{\"Name\" : \"Tom\" , \"Age\":44},{\"Name\" : \"Abel\",\"Age\":29}] }";    // 获取员工名称    JObject jObject = JObject.Parse(json);    var name = jObject.Value<string>("Name");        Console.WriteLine(name);    // 获取员工年龄    JToken jToken = jObject.SelectToken("Age");    Console.WriteLine(jToken.ToString());        // 获取同事信息    JToken jToken1 = jObject["Colleagues"];    Console.WriteLine(jToken1.ToString());        Console.WriteLine("=============================");    // 获取员工同事的所有姓名    var names = from staff in jToken1.Children()                select (string)staff["Name"];    // var names = jObject.SelectToken("Colleagues").Select(p => p["Name"]).ToList();    foreach (var item in names)    {        Console.WriteLine(item);    }        Console.WriteLine("=============================");    // 修改Jack的年龄    jObject["Age"] = 99;    Console.WriteLine(jObject.ToString());    // 修改同事Tome的年龄    jToken1[0]["Age"] = 45;    Console.WriteLine(jObject.ToString());        Console.WriteLine("=============================");    // Abel离职了    jObject["Colleagues"][1].Remove();    Console.WriteLine(jObject.ToString());    // 移除Jack的同事    jObject.Remove("Colleagues");    Console.WriteLine(jObject.ToString());        Console.WriteLine("=============================");    // Jack缺少部门信息    jObject["Age"].Parent.AddAfterSelf(new JProperty("Department", "总裁办"));    // 来了一个新员工Jerry    JObject linda = new JObject(new JProperty("Name", "Linda"), new JProperty("Age", "23"));    jObject.Add(new JProperty("Colleagues", new JArray() { linda }));    Console.WriteLine(jObject.ToString());}// Define other methods and classes here

以上就是“C#中的Linq to JSON操作实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯