Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和修改部分的数据而非反序列化全部.

https://www.newtonsoft.com/json/help/html/LINQtoJSON.htm

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

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

1、创建JObject and JArrary实例

创建JSON对象

  1. JObject staff = new JObject();
  2. staff.Add(new JProperty("Name", "Jack"));
  3. staff.Add());
  4. staff.Add(new JProperty("Department", "Personnel Department"));
  5. staff.Add(), new JProperty("Department", "Personnel Department"))));
  6. Console.WriteLine(staff.ToString());

创建JSON数组

  1. JArray arr = new JArray();
  2. arr.Add());
  3. arr.Add());
  4. arr.Add());
  5. Console.WriteLine(arr.ToString());

除此之外,还可以通过一下方式来获取JObject.JArray类似。

方法   说明
  1. JObject.Parse(string json)
json含有JSON对象的字符串,返回为JObject对象
  1. JObject.FromObject(object o)

o为要转化的对象,返回一个JObject对象

  1. JObject.Load(JsonReader reader)
reader包含着JSON对象的内容,返回一个JObject对象

如解析字符串:

  1. JArray a =JArray.Parse(jsonText);
  2. //或
  3. JObject jo = JObject.Parse(jsonText);

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

数组数据

  1. string jsonArrayText= "[{'a','al'.'b','b1'},{'a','a2'.'b','b2'}]";
  2. JArray ja =][]; string oa=o["a"].ToString();

对象格式

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

3、修改JObject and JArrary实例

  1. string json = @"{
  2. 'post':{
  3. 'Title':'修改JArray和JObject',
  4. 'Link':'http://write.blog.csdn.net',
  5. 'Description':'这是一个修改JArray和JObject的演示案例',
  6. 'Item':[]
  7. }
  8. }";
  9.  
  10. JObject o = JObject.Parse(json);
  11. JObject post = (JObject)o["post"];
  12.  
  13. post["Title"] = ((string)post["Title"]).ToUpper();
  14. post["Link"] = ((string)post["Link"]).ToUpper();
  15.  
  16. post.Property("Description").Remove();
  17.  
  18. post.Property("Link").AddAfterSelf(new JProperty("New", "新添加的属性"));
  19.  
  20. JArray a = (JArray)post["Item"];
  21. a.Add("修改JArray");
  22. a.Add("修改JObject");
  1. 移除属性
  1. JObject jObj = JObject.Parse(json);
  2. jObj.Remove("Colleagues");//跟的是属性名称
  3. Console.WriteLine(jObj.ToString());

4、查询JObject and JArrary实例

  1. string json = @"{
  2. 'channel': {
  3. 'title': 'James Newton-King',
  4. 'link': 'http://james.newtonking.com',
  5. 'description': 'James Newton-King\'s blog.',
  6. 'item': [
  7. {
  8. 'title': 'Json.NET 1.3 + New license + Now on CodePlex',
  9. 'description': 'Announcing the release of Json.NET 1.3, the MIT license and the source on CodePlex',
  10. 'link': 'http://james.newtonking.com/projects/json-net.aspx',
  11. 'categories': [
  12. 'Json.NET',
  13. 'CodePlex'
  14. ]
  15. },
  16. {
  17. 'title': 'LINQ to JSON beta',
  18. 'description': 'Announcing LINQ to JSON',
  19. 'link': 'http://james.newtonking.com/projects/json-net.aspx',
  20. 'categories': [
  21. 'Json.NET',
  22. 'LINQ'
  23. ]
  24. }
  25. ]
  26. }
  27. }";
  28.  
  29. JObject rss = JObject.Parse(json);
  30.  
  31. string rssTitle = (string)rss["channel"]["title"];
  32. // James Newton-King
  33.  
  34. ]["title"];
  35. // Json.NET 1.3 + New license + Now on CodePlex
  36.  
  37. JArray categories = (JArray)rss[]["categories"];
  38. // ["Json.NET", "CodePlex"]
  39.  
  40. IList<string> categoriesText = categories.Select(c => (string)c).ToList();
  41. // Json.NET
  42. // CodePlex

5、Querying with LINQ

  1. var postTitles =
  2. from p in rss["channel"]["item"]
  3. select (string)p["title"];
  4.  
  5. foreach (var item in postTitles)
  6. {
  7. Console.WriteLine(item);
  8. }
  9.  
  10. //LINQ to JSON beta
  11. //Json.NET 1.3 + New license + Now on CodePlex
  12.  
  13. var categories =
  14. from c in rss["channel"]["item"].SelectMany(i => i["categories"]).Values<string>()
  15. group c by c
  16. into g
  17. orderby g.Count() descending
  18. select new { Category = g.Key, Count = g.Count() };
  19.  
  20. foreach (var c in categories)
  21. {
  22. Console.WriteLine(c.Category + " - Count: " + c.Count);
  23. }
  24.  
  25. //Json.NET - Count: 2
  26. //LINQ - Count: 1
  27. //CodePlex - Count: 1

6、使用函数SelectToken可以简化查询语句

①利用SelectToken来查询名称

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

结果:Jack

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

  1. JObject jObj = JObject.Parse(json);
  2. var names = jObj.SelectToken("Colleagues").Select(p => p["Name"]).ToList();
  3. foreach (var name in names)
  4. Console.WriteLine(name.ToString());

结果:Tom Abel

③查询最后一名同事的年龄

  1. //将json转换为JObject
  2. JObject jObj = JObject.Parse(json);
  3. var age = jObj.SelectToken("Colleagues[1].Age");
  4. Console.WriteLine(age.ToString());

结果:29

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

例如:

  1. { ",
  2. "},
  3. {"},
  4. {"},
  5. {"},
  6. {"}
  7. ] }, }

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

  1. var jObj = JObject.Parse(jsonString);
  2. var tends = from c in jObj.First.First.First.First.Children()
  3. select JsonConvert.DeserializeObject<Trend>(c.ToString());
  4. public class Trend
  5. {
  6. public string Name { get; set; }
  7. public string Query { get; set; }
  8. public string Amount { get; set; }
  9. public string Delta { get; set; }
  10. }

Json.Net 中Linq to JSON的操作的更多相关文章

  1. 在JS和.NET中使用JSON (以及使用Linq to JSON定制JSON数据)

    转载原地址: http://www.cnblogs.com/mcgrady/archive/2013/06/08/3127781.html 阅读目录 JSON的两种结构 认识JSON字符串 在JS中如 ...

  2. Newtonsoft.json中 linq to json 和序列化哪个快?

    Newtonsoft.json是最常用的json序列化组件,当然他不是最快的,但是是功能最全的.. using System; using System.Collections.Generic; us ...

  3. 关于json解析中 解析多重json对象

    JSONObject rst = {"AIS-RST":"AIS-00000001","AIS-STATUS":"AIS-0000 ...

  4. 处理Json数据中的日期类型.如/Date(1415169703000)/格式

    在asp.net mvc后台返回到视图中的json数据中想对数据进行操作,发现日期类型无法直接进行操作,需要转换为指定格式才行.在网上也搜了下方法也很多,觉得有点麻烦,最终使用正则搞定了,分享下: v ...

  5. 【转】python 历险记(四)— python 中常用的 json 操作

    [转]python 历险记(四)— python 中常用的 json 操作 目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编 ...

  6. python 历险记(四)— python 中常用的 json 操作

    目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编码和解码? 常用的 json 操作有哪些? json 操作需要什么库? 如何 ...

  7. Linq to json

    Json.Net系列教程 4.Linq To JSON 一.Linq to JSON是用来干什么的? Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JS ...

  8. [Json.net]Linq to Json

    引言 上篇学习了json.net的基本知识,这篇学习linq to json. 上篇文章:[Json.net]快速入门 Linq to Json Linq to Json是用来快速操作json对象的, ...

  9. Json.net/Newtonsoft 3.0 新特性JObject/Linq to Json

    原文:http://www.cnblogs.com/chsword/archive/2008/09/19/Newtonsoft_new_3_0.html http://www.cnblogs.com/ ...

随机推荐

  1. 记一次idea性能调优

    因自研的自动化测试工具包含压测功能,在自己本地代码开发完毕后进行测试,对目标接口进行1000次访问,发现idea在执行结束后变的异常卡顿,怀疑是idea工具或者程序代码存在问题,遂进行排查. ---- ...

  2. Oracle 行列转换总结

    行列转换包括以下六种情况:*列转行*行转列*多列转换成字符串*多行转换成字符串*字符串转换成多列*字符串转换成多行 下面分别进行举例介绍. 首先声明一点,有些例子需要如下10g及以后才有的知识:a.掌 ...

  3. Android如何避免输入法弹出时遮挡住按钮或输入框

    在AndroidManifest.xml中为对应的activity添加android:windowSoftInputMode="adjustResize" 在AndroidMani ...

  4. [tools]转载汇总

    1. 发送请求工具—Advanced REST Client Advanced REST Client是Chrome浏览器下的一个插件,通过它可以发送http.https.WebSocket请求.

  5. ASP.NET Core中使用自定义路由

    上一篇文章<ASP.NET Core中使用默认MVC路由>提到了如何使用默认的MVC路由配置,通过这个配置,我们就可以把请求路由到Controller和Action,通常情况下我们使用默认 ...

  6. js验证护照号码是否合规

    需求:最近要做实名验证的功能,但是验证我们要验证严谨一点,参考了网上关于验证护照号码的代码,总结一下. 代码: //验证护照号码 function checkPassport(code){ var t ...

  7. Query performance optimization of Vertica

    Don't fetch any data that you don't need,or don't fetch any columns that you don't need. Because ret ...

  8. Node.js学习笔记(一) --- HTTP 模块、URL 模块、supervisor 工具

    一.Node.js创建第一个应用 如果我们使用 PHP 来编写后端的代码时,需要 Apache 或者 Nginx 的 HTTP 服务器, 来处理客户端的请求相应.不过对 Node.js 来说,概念完全 ...

  9. asp.net Core2.1连接到Mysql 数据库

    1.首先,安装相关插件 在nuget下安装 1.Pomelo.EntityFrameworkCore.MySql 2.MySql.Data.EntityFrameworkCore 都要是2.1 < ...

  10. 二、IOC容器基本原理

    IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需在代码中new相关的对象,应用程序由IOC容器进行组装. spring IOC ...