原文 Json.Net系列教程 4.Linq To JSON

更改历史

  • 2013-05-31 添加一个FAQ
 
一.Linq to JSON是用来干什么的?

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

二.创建JSON数组和对象

在进行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.创建JSON对象

  1. JObject staff = new JObject();
  2. staff.Add(new JProperty("Name", "Jack"));
  3. staff.Add(new JProperty("Age", ));
  4. staff.Add(new JProperty("Department", "Personnel Department"));
  5. staff.Add(new JProperty("Leader", new JObject(new JProperty("Name", "Tom"), new JProperty("Age", ), new JProperty("Department", "Personnel Department"))));
  6. Console.WriteLine(staff.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对象

2.创建JSON数组

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

结果:

三.使用Linq to JSON

1.查询
首先准备Json字符串,是一个包含员工基本信息的Json

  1. string json = "{\"Name\" : \"Jack\", \"Age\" : 34, \"Colleagues\" : [{\"Name\" : \"Tom\" , \"Age\":44},{\"Name\" : \"Abel\",\"Age\":29}] }";

①获取该员工的姓名

  1. //将json转换为JObject
  2. JObject jObj = JObject.Parse(json);
  3. //通过属性名或者索引来访问,仅仅是自己的属性名,而不是所有的
  4. JToken ageToken = jObj["Age"];
  5. Console.WriteLine(ageToken.ToString());

结果:

②获取该员工同事的所有姓名

  1. //将json转换为JObject
  2. JObject jObj = JObject.Parse(json);
  3. var names=from staff in jObj["Colleagues"].Children()
  4. select (string)staff["Name"];
  5. foreach (var name in names)
  6. Console.WriteLine(name);

"Children()"可以返回所有数组中的对象

结果:

2.修改

①现在我们发现获取的json字符串中Jack的年龄应该为35

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

结果:

注意不要通过以下方式来修改:

  1. JObject jObj = JObject.Parse(json);
  2. JToken age = jObj["Age"];
  3. age = ;

②现在我们发现Jack的同事Tom的年龄错了,应该为45

  1. //将json转换为JObject
  2. JObject jObj = JObject.Parse(json);
  3. JToken colleagues = jObj["Colleagues"];
  4. colleagues[]["Age"] = ;
  5. jObj["Colleagues"] = colleagues;//修改后,再赋给对象
  6. Console.WriteLine(jObj.ToString());

结果:

3.删除
①现在我们想删除Jack的同事

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

结果:

②现在我们发现Abel不是Jack的同事,要求从中删除

  1. JObject jObj = JObject.Parse(json);
  2. jObj["Colleagues"][].Remove();
  3. Console.WriteLine(jObj.ToString());

结果:

4.添加
①我们发现Jack的信息中少了部门信息,要求我们必须添加在Age的后面

  1. //将json转换为JObject
  2. JObject jObj = JObject.Parse(json);
  3. jObj["Age"].Parent.AddAfterSelf(new JProperty("Department", "Personnel Department"));
  4. Console.WriteLine(jObj.ToString());

结果:

②现在我们又发现,Jack公司来了一个新同事Linda

  1. //将json转换为JObject
  2. JObject jObj = JObject.Parse(json);
  3. JObject linda = new JObject(new JProperty("Name", "Linda"), new JProperty("Age", ""));
  4. jObj["Colleagues"].Last.AddAfterSelf(linda);
  5. Console.WriteLine(jObj.ToString());

结果:

四.简化查询语句

使用函数SelectToken可以简化查询语句,具体:
①利用SelectToken来查询名称

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

结果:

②利用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());

结果:

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

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

结果:

FAQ

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

例如:

  1. {
  2. "trends":
  3. {
  4. "2013-05-31 14:31":
  5. [
  6. {"name":"我不是谁的偶像",
  7. "query":"我不是谁的偶像",
  8. "amount":"",
  9. "delta":""},
  10. {"name":"世界无烟日","query":"世界无烟日","amount":"","delta":""},
  11. {"name":"最萌身高差","query":"最萌身高差","amount":"","delta":""},
  12. {"name":"中国合伙人","query":"中国合伙人","amount":"","delta":""},
  13. {"name":"exo回归","query":"exo回归","amount":"","delta":""},
  14. {"name":"新一吻定情","query":"新一吻定情","amount":"","delta":""},
  15. {"name":"进击的巨人","query":"进击的巨人","amount":"","delta":""},
  16. {"name":"谁的青春没缺失","query":"谁的青春没缺失","amount":"","delta":""},
  17. {"name":"我爱幸运七","query":"我爱幸运七","amount":"","delta":""},
  18. {"name":"母爱10平方","query":"母爱10平方","amount":"","delta":""}
  19. ]
  20. },
  21. "as_of":
  22. }

其中的"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系列教程 4.Linq To JSON的更多相关文章

  1. Json.Net(Newtonsoft)系列教程 4.Linq To JSON

    转自:https://www.cnblogs.com/sczmzx/p/7813834.html   一.Linq to JSON是用来干什么的? Linq to JSON是用来操作JSON对象的.可 ...

  2. Json.Net系列教程 1.Json.Net介绍及实例

    原文 Json.Net系列教程 1.Json.Net介绍及实例 本系列教程假设读者已经对Json有一定的了解,关于Json在这里不多说.本系列教程希望能对读者开发涉及到Json的.Net项目有一定的帮 ...

  3. Json.Net系列教程 3.Json.Net序列化和反序列化设置

    原文 Json.Net系列教程 3.Json.Net序列化和反序列化设置 上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framewo ...

  4. Json.Net系列教程 2.Net类型与JSON的映射关系

    原文 Json.Net系列教程 2.Net类型与JSON的映射关系 首先谢谢大家的支持和关注.本章主要介绍.Net类型与JSON是如何映射的.我们知道JSON中类型基本上有三种:值类型,数组和对象.而 ...

  5. Json杂谈系列------(一)初始json

    1. JSON 是什么 JSON,全称是 JavaScript Object Notation,即 JavaScript 对象标记法.这是一种轻量级(Light-Weight).基于文本的(Text- ...

  6. json学习系列(1)-使用json所要用到的jar包下载

    内容来源于互联网. json是个非常重要的数据结构,在web开发中应用十分广泛.每个开发者都应该好好的去研究一下json的底层实现.在使用json之前首先要明白需要哪些jar文件,初次使用的时候很容易 ...

  7. Linq to json

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

  8. json教程系列(1)-使用json所要用到的jar包下载

    json是个非常重要的数据结构,在web开发中应用十分广泛.我觉得每个人都应该好好的去研究一下json的底层实现,基于这样的认识,金丝燕网推出了一个关于json的系列教程,分析一下json的相关内容, ...

  9. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

随机推荐

  1. iWeb峰会见闻

    8.16去参加了iWeb峰会,一大早8点过10分就到了,发现外面已经排起了长队(说明影响力越来越大,关注的人越来越多了.) 此次大会参与的企业也越来越多,当然是有目的而来~ 上午 google商业合作 ...

  2. SQL学习之Insert的特殊用法(插入检索出的数据,表之间的数据复制)

    1.插入检索出的数据 select * from dbo.Customers_1

  3. js中的数组和字符串的一些方法

    数组的一些方法: 1.join()和split()方法 <script type="text/javascript">var x;var a=new Array();a ...

  4. T-SQL语句中中括号([])的用法是什么,什么时候该用

    加了[]是为了防止歧义,使计算机能识别.有些字段可能是关键字,这时候你直接用字段名就会报错,如果加了[]就可以正常执行了

  5. sql查询当天数据

    向数据库中添加日期 MS SQL SERVER: NSERT into student(studentid,time1)values('15',getdate()); MY SQLinsert int ...

  6. IO与文件读写---使用Apache commons IO包提高读写效率

    觉得很不错,就转载了, 作者: Paul Lin 首先贴一段Apache commons IO官网上的介绍,来对这个著名的开源包有一个基本的了解:Commons IO is a library of ...

  7. java新特性之可变参数

    public class NewDemo01 {     public static void main(String[] args) {         System.out.print(" ...

  8. css样式写一个三角形

    <style> .test{ border-color:transparent #abcdef transparent transparent; border-style:solid; b ...

  9. The method of using code coverage tool

    Please look at the following blog: http://blog.csdn.net/superqa/article/details/9060521 Use  ReportG ...

  10. 各种排序算法(C语言)

    #include <stdlib.h> #include <stdio.h> void DataSwap(int* data1, int* data2) { int temp ...