LINQ to JSON
LINQ to JSON是用来处理JSON对象的API。它的设计考虑了LINQ,以支持快速查询和创建JSON对象。LINQ to JSON位于Newtonsoft.Json.Linq命名空间下面。
使用LINQ for JSON
JObject o = JObject.Parse(@"{
'CPU': 'Intel',
'Drives': [
'DVD read/writer',
'500 gigabyte hard drive'
]
}");
string cpu = (string)o["CPU"];
// Intel
string firstDrive = (string)o["Drives"][0];
// DVD read/writer
IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList();
// DVD read/writer
// 500 gigabyte hard drive
主题
从下面选择一个主题以进一步了解
- 解析JSON
- 创建JSON
- 利用LINQ解析JSON
- 利用SelectToken查询JSON
解析JSON
LINQ to JSON具有一些方法,可用来从字符串解析JSON,或直接从文件载入JSON。
- 解析JSON文本
- 从文件载入JSON
解析JSON文本
可利用Parse(String)从一个字符串读取JSON值。
从文本解析一个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);
从文件中载入JSON
还可以利用ReadFrom(JsonReader)直接从文件中载入JSON。
从文件中读取JSON
using (StreamReader reader = File.OpenText(@"c:\person.json"))
{
JObject o = (JObject)JToken.ReadFrom(new JsonTextReader(reader));
// do stuff
}
创建JSON
除了解析已有的JSON字符串,还可以从零开始LINQ to JSON对象,创建也一个新的JSON结构。
- 手工创建JSON
- 利用LINQ创建JSON
- 从对象创建JSON
手工创建JSON
逐个设置值,并创建一个对象和数组,给你完全的控制,但是它比其他选项现详细。
创建JSON
JArray array = new JArray();
JValue text = new JValue("Manual text");
JValue date = new JValue(new DateTime(2000, 5, 23));
array.Add(text);
array.Add(date);
string json = array.ToString();
// [
// "Manual text",
// "2000-05-23T00:00:00"
// ]
利用LINQ创建JSON
使用LINQ声明式地创建JSON,是一种根据值的集合创建JSON的快速方法。
声明式地创建JSON
List<Post> 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"
// ]
// }
// ]
// }
//}
从对象创建JSON
从非JSON类型创建JSON对象的最后一个选项是使用FromObject()方法。在内部,FromObject将使用JsonSerializer将对象序列化为LINQ to JSON对象,而不是文本。
下面的示例演示了从匿名对象创建一个JSON对象,但是FromObject中可以使用任何.NET对象,来创建JSON。
从对象创建JSON
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
}
}
});