.NET(C#) Json.Net(newtonsoft)使用LINQ查询JSON数据

LINQ to JSON提供了许多从对象获取数据的方法。JObject/JArray上的索引方法允许您通过对象或集合索引上的属性名快速获取数据,而Children()允许您以IEnumerable<JToken>的形式获取数据范围,然后使用LINQ进行查询。

1、通过属性名或集合索引获取值

将一个值从LINQ转换为JSON的最简单方法是在JObject/JArray上使用Item[Object]索引,然后将返回的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-King
string itemTitle = (string)rss["channel"]["item"][0]["title"];
// Json.NET 1.3 + New license + Now on CodePlex
JArray categories = (JArray)rss["channel"]["item"][0]["categories"];
// ["Json.NET", "CodePlex"]
IList<string> categoriesText = categories.Select(c => (string)c).ToList();
// Json.NET
// CodePlex

2、用LINQ查询

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

Note:

Children()返回令牌的所有子元素。如果是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 CodePlex
var categories =
from c in rss["channel"]["item"].SelectMany(i => i["categories"]).Values<string>()
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对象

public 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; }
}

当您处理与.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 taken

相关文档.NET(C#) Json.Net(newtonsoft)操作处理(解析)JSON数据(LINQ to JSON)

推荐阅读
cjavapy编程之路首页