广告
返回顶部
首页 > 资讯 > 精选 >C#中的Linq to JSON操作实例分析
  • 506
分享到

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

2023-06-30 18:06:03 506人浏览 安东尼
摘要

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

今天小编给大家分享一下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操作实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

    --结束END--

    本文标题: C#中的Linq to JSON操作实例分析

    本文链接: https://www.lsjlt.com/news/330677.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C#中的Linq to JSON操作实例分析
      今天小编给大家分享一下C#中的Linq to JSON操作实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
      99+
      2023-06-30
    • C#中的Linq to JSON操作详解
      目录一、创建JObject and JArrary实例1、手动创建JSON1、创建JSON对象,JObject2、创建JSON数组,JArrary2、使用Linq创建JSON3、从对...
      99+
      2022-11-13
    • C#中的LINQ to Objects实例分析
      这篇文章主要介绍了C#中的LINQ to Objects实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中的LINQ to Objects实例分析文章都会有所收...
      99+
      2023-06-30
    • LINQ to XML操作举例分析
      这篇文章主要讲解了“LINQ to XML操作举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LINQ to XML操作举例分析”吧!LINQ to XML操作XElement&nbs...
      99+
      2023-06-17
    • LINQ TO SQL操作据举例分析
      本篇内容介绍了“LINQ TO SQL操作据举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!LINQ TO SQL很好很强大,它几乎包...
      99+
      2023-06-17
    • Python中的json操作实例分析
      本文小编为大家详细介绍“Python中的json操作实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python中的json操作实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.什么是JsonJS...
      99+
      2023-06-30
    • golang中json操作实例分析
      这篇“golang中json操作实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“golang中json操作实例分析”文...
      99+
      2023-07-02
    • LINQ to SQL删除实现的示例分析
      LINQ to SQL删除实现的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在实现LINQ to SQL删除时可以使用Lambda Expression批量删除数...
      99+
      2023-06-17
    • C++中文件操作实例分析
      这篇文章主要介绍“C++中文件操作实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中文件操作实例分析”文章能帮助大家解决问题。文件操作意义:利用文件操作可以保存我们程序运行的信息,是持久...
      99+
      2023-07-02
    • C++中IO流操作实例分析
      这篇“C++中IO流操作实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中IO流操作实例分析”文章吧。1.标准输...
      99+
      2023-07-02
    • C#操作Excel实现的实例分析
      C#操作Excel实现的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#操作Excel是怎么样执行的呢?我们在实际的C#操作Excel开发程序过程中主要会使用到那些方...
      99+
      2023-06-17
    • C#原子操作实例分析
      这篇文章主要讲解了“C#原子操作实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#原子操作实例分析”吧!知识点竞争条件当两个或两个以上的线程访问共享数据,并且尝试同时改变它时,就发生...
      99+
      2023-06-29
    • C语言中的文件操作实例分析
      这篇文章主要介绍了C语言中的文件操作实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中的文件操作实例分析文章都会有所收获,下面我们一起来看看吧。1.为什么使用文件在学习结构体时,写了一个简易的通讯录...
      99+
      2023-07-02
    • C#操作Word应用实例分析
      本篇内容主要讲解“C#操作Word应用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#操作Word应用实例分析”吧!C#操作Word实际应用实例:课程是关于电子病历的,内容就是用wor...
      99+
      2023-06-18
    • C#操作注册表实例分析
      这篇文章主要讲解了“C#操作注册表实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#操作注册表实例分析”吧!在下面的例子里,要注意:建项函数:CreateSubKey()建子键函数:...
      99+
      2023-06-18
    • C++操作符的示例分析
      这篇文章给大家介绍C++操作符的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++操作符是C++中的一个高级C++技术,下面进行相关介绍,或许你发现,有些操作符使用了相同的符号,符号的意义可以随环境进行改变,...
      99+
      2023-06-17
    • C语言文件的操作实例分析
      这篇文章主要介绍了C语言文件的操作实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言文件的操作实例分析文章都会有所收获,下面我们一起来看看吧。一、为什么使用文件当我们写一些项目的时候,我们应该要把写的...
      99+
      2023-06-30
    • C语言的堆串实例操作分析
      今天小编给大家分享一下C语言的堆串实例操作分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、堆串概念与定长顺序穿的存储结...
      99+
      2023-06-29
    • C语言中单目操作符++、–的实例分析
      C语言中单目操作符++、–的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言大家先判断下下面代码的运行结果答案:如果你全对了,那么恭喜大佬,这篇博客可能对你收益不大,...
      99+
      2023-06-22
    • C语言文件操作实例分析
      这篇文章主要介绍了C语言文件操作实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言文件操作实例分析文章都会有所收获,下面我们一起来看看吧。一、为什么使用文件?当我们在编写一个项目的时候,自然而然想到要...
      99+
      2023-07-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作