C#解析JSON
首先使用nuget搜索json,如下图选择第一个包安装。
然后引用命名空间 using Newtonsoft.Json;
以下面的JSON文件为例子解析:
{"page":1,"results":
[
{
"adult":false,
"backdrop_path":"/k7h4RNAarfOrF2r2YMN0P2FQSr4.jpg",
"genre_ids":[80,18,53,28],
"id":75780,
"original_language":"en",
"original_title":"Jack Reacher",
"overview":" 根据“英国惊悚小说天王”李查德的小说《完美嫌犯》改编。 六发子弹,五名死者,神秘枪手在闹市区制造了一起惨案让整个城市都陷入魁了恐慌。所有的证据都指向了前军队狙击手詹姆斯·巴尔(约瑟夫·斯科拉 Joseph Sikora 饰)。但他坚持自己的清白并要求把老相识 杰克·理查尔(汤姆·克鲁斯 Tom Cruise 饰)找来,两人曾同在军队中服役。随着杰克调查的深入,他发现了更大的谜团,炮制这场惨案的真凶似乎另有其人,而别有用心的幕后黑手抓走了巴尔 ,只留下杰克一人探明真相。 六发子弹中有一发漏空的子弹是杀手故意放空的。为了了解狙击手的工作,杰克特意来到了狙击手的训练营找到了一个叫做萨缪尔·卡什(罗伯特·杜瓦尔 Robert Duvall 饰)的教练。在卡什和巴尔妹妹以及律师的帮助下,杰克渐渐走进了事件的中心位置,一个关于苏联改造营和俄罗斯黑帮的秘密也慢慢浮出水面……",
"popularity":24.634,
"poster_path":"/jJX1yrIvT9cmvKb6vcoGiRdPxbD.jpg",
"release_date":"2012-12-20","title":"侠探杰克",
"video":false,
"vote_average":6.5,
"vote_count":5030
},
{
"adult":false,
"backdrop_path":"/ww1eIoywghjoMzRLRIcbJLuKnJH.jpg",
"genre_ids":[28],
"id":343611,
"original_language":"en",
"original_title":"Jack Reacher: Never Go Back",
"overview":" 续集故事继续围绕杰克展开。他重回弗吉尼亚州的军事基地和苏珊·特纳少校会面,要解决一些个人问题。此时,特纳却意外被捕。杰克同时也陷入谜团,因为他被诬告犯有重罪,而且牵涉到一个自己完全不知道的小孩。这些,杰克都记不起来了。他要客服重重困难,去寻找特纳,最终解决问题。",
"popularity":24.533,
"poster_path":"/wxLUQ1pIms3HAlVGYvEG9zg2kDs.jpg",
"release_date":"2016-10-19",
"title":"侠探杰克:永不回头",
"video":false,
"vote_average":5.7,
"vote_count":3419
}
],
"total_pages":1,
"total_results":2
}
可以通过在线工具生成C#实体,例如下面这个网站:
https://www.sojson.com/json2csharp.html
生成的实体如下:
public class ResultsItem { /// <summary> /// /// </summary> public string adult { get; set; } /// <summary> /// /// </summary> public string backdrop_path { get; set; } /// <summary> /// /// </summary> public List <int > genre_ids { get; set; } /// <summary> /// /// </summary> public int id { get; set; } /// <summary> /// /// </summary> public string original_language { get; set; } /// <summary> /// /// </summary> public string original_title { get; set; } /// <summary> /// /// </summary> public string overview { get; set; } /// <summary> /// /// </summary> public double popularity { get; set; } /// <summary> /// /// </summary> public string poster_path { get; set; } /// <summary> /// /// </summary> public string release_date { get; set; } /// <summary> /// 侠探杰克 /// </summary> public string title { get; set; } /// <summary> /// /// </summary> public string video { get; set; } /// <summary> /// /// </summary> public double vote_average { get; set; } /// <summary> /// /// </summary> public int vote_count { get; set; } } public class Root { /// <summary> /// /// </summary> public int page { get; set; } /// <summary> /// /// </summary> public List <ResultsItem > results { get; set; } /// <summary> /// /// </summary> public int total_pages { get; set; } /// <summary> /// /// </summary> public int total_results { get; set; } }
将上面的类复制到自己的程序中,main函数中可以下面这样简单使用:
string jsonText = "{"page":1,"results":[{"adult":false,"backdrop_path":"/k7h4RNAarfOrF2r2YMN0P2FQSr4.jpg","genre_ids":[80,18,53,28],"id":75780,"original_language":"en","original_title":"Jack Reacher","overview":" 根据“英国惊悚小说天王”李查德的小说《完美嫌犯》改编。\r 六发子弹,五名死者,神秘枪手在闹市区制造了一起惨案让整个城市都陷入魁了恐慌。所有的证据都指向了前军队狙击手詹姆斯·巴尔(约瑟夫·斯科拉 Joseph Sikora 饰)。但他坚持自己的清白并要求把老相识 杰克·理查尔(汤姆·克鲁斯 Tom Cruise 饰)找来,两人曾同在军队中服役。随着杰克调查的深入,他发现了更大的谜团,炮制这场惨案的真凶似乎另有其人,而别有用心的幕后黑手抓走了巴尔 ,只留下杰克一人探明真相。\r 六发子弹中有一发漏空的子弹是杀手故意放空的。为了了解狙击手的工作,杰克特意来到了狙击手的训练营找到了一个叫做萨缪尔·卡什(罗伯特·杜瓦尔 Robert Duvall 饰)的教练。在卡什和巴尔妹妹以及律师的帮助下,杰克渐渐走进了事件的中心位置,一个关于苏联改造营和俄罗斯黑帮的秘密也慢慢浮出水面……","popularity":24.634,"poster_path":"/jJX1yrIvT9cmvKb6vcoGiRdPxbD.jpg","release_date":"2012-12-20","title":"侠探杰克","video":false,"vote_average":6.5,"vote_count":5030},{"adult":false,"backdrop_path":"/ww1eIoywghjoMzRLRIcbJLuKnJH.jpg","genre_ids":[28],"id":343611,"original_language":"en","original_title":"Jack Reacher: Never Go Back","overview":" 续集故事继续围绕杰克展开。他重回弗吉尼亚州的军事基地和苏珊·特纳少校会面,要解决一些个人问题。此时,特纳却意外被捕。杰克同时也陷入谜团,因为他被诬告犯有重罪,而且牵涉到一个自己完全不知道的小孩。这些,杰克都记不起来了。他要客服重重困难,去寻找特纳,最终解决问题。","popularity":24.533,"poster_path":"/wxLUQ1pIms3HAlVGYvEG9zg2kDs.jpg","release_date":"2016-10-19","title":"侠探杰克:永不回头","video":false,"vote_average":5.7,"vote_count":3419}],"total_pages":1,"total_results":2}"; Root root = JsonConvert.DeserializeObject<Root>(jsonText); Console.WriteLine(root.results[0].overview);
上面的json进行了压缩并转义,获取了result列表中的第一项。当然如果直接从文件中读取就不用这么麻烦了。