本文概述
由于许多原因, 许多人在网络上使用JSON而不是XML:
- JSON比XML所需的标签少-XML项必须包装在打开和关闭标签中, 而JSON仅将标签命名一次。
- JSON更好地帮助基于对象及其值(或方法)的JavaScript中的过程决策。
- JSON比XML更易于阅读(对于许多开发人员而言, 这种情况更少)。
- JSON是值的有序列表。在大多数语言中, 这被实现为数组, 向量, 列表或序列。
- 之间更多…
因此, 如果Web服务决定(我真的对此表示怀疑)仅提供JSON格式的服务, 那么如果你不知道如何使用C#正确处理JSON数据, 你将被困一阵子。
在本文中学习如何在Windows窗体中使用JSON.NET库以所有方式(读取, 序列化, 反序列化等)来操纵JSON。
要求
- 带NuGet软件包管理器的Visual Studio(> = 2010)。
安装JSON.NET
像往常一样继续创建Winforms应用程序, 并以.NET Framework的最新版本为目标。现在, 在创建之后, 我们将在项目中添加JSON.NET库作为依赖项。
JSON.NET是用于.NET平台的高性能JSON框架, 它允许你使用Json.NET强大的JSON序列化程序对任何.NET对象进行序列化和反序列化。
为什么要使用JSON.NET库?
- Json.NET使简单变得容易, 复杂变得可能。
- 使用Json.NET的JObject, JArray和JValue对象创建, 解析, 查询和修改JSON。
- Json.NET支持Windows, Windows Store, Windows Phone, Mono和Xamarin。
- Json.NET是开源软件, 完全免费用于商业用途。
- 比DataContractJsonSerializer快50%, 比JavaScriptSerializer快250%。
由于该库具有高性能, 请参阅下表比较其他已知库之间的JSON.NET性能:
要安装, 请在解决方案资源管理器中右键单击你的项目, 然后选择”管理NuGet软件包”。
当出现搜索菜单时, 键入JSON.NET, 选择WinForms发行版并安装它。
与Visual Studio的每个版本一样, 界面可能有所不同, 只需确保安装位于nuget.org包源中的The Newton.Json by the James Newton-King发行版, 在此示例中, 我们使用的是Visual Studio 2015。
请遵循安装设置(接受条款并进行安装)。在安装过程中, 你应该在控制台中看到有关该过程的相关信息:
Attempting to gather dependency information for package 'Newtonsoft.Json.8.0.3' with respect to project 'UniversalSandbox', targeting '.NETFramework, Version=v4.5.2'
Attempting to resolve dependencies for package 'Newtonsoft.Json.8.0.3' with DependencyBehavior 'Lowest'
Resolving actions to install package 'Newtonsoft.Json.8.0.3'
Resolved actions to install package 'Newtonsoft.Json.8.0.3'
GET https://api.nuget.org/packages/newtonsoft.json.8.0.3.nupkg
OK https://api.nuget.org/packages/newtonsoft.json.8.0.3.nupkg 27ms
Installing Newtonsoft.Json 8.0.3.
Adding package 'Newtonsoft.Json.8.0.3' to folder 'F:\C# Development\Winform projects\UniversalSandbox\packages'
Added package 'Newtonsoft.Json.8.0.3' to folder 'F:\C# Development\Winform projects\UniversalSandbox\packages'
Added package 'Newtonsoft.Json.8.0.3' to 'packages.config'
Executing script file 'F:\C# Development\Winform projects\UniversalSandbox\packages\Newtonsoft.Json.8.0.3\tools\install.ps1'...
Successfully installed 'Newtonsoft.Json 8.0.3' to UniversalSandbox
========== Finished ==========
现在, 你将可以轻松地在项目中使用Json.NET。
使用JSON.NET
主要的, 不要忘记在处理JSON的类中包含相应的use语句。
using Newtonsoft.Json;
现在看到用C#进行JSON操作的基本示例集合(序列化和反序列化):
读取JSON
就像使用XML文件使用JsonTextReader和StringReader(基本阅读)那样, 读取JSON字符串。
using Newtonsoft.Json;
using System.IO;
string json = @"{
'CPU': 'Intel', 'PSU': '500W', 'Drives': [
'DVD read/writer'
/*(broken)*/, '500 gigabyte hard drive', '200 gigabype hard drive'
]
}";
JsonTextReader reader = new JsonTextReader(new StringReader(json));
while (reader.Read())
{
if (reader.Value != null)
{
Console.WriteLine("Token: {0}, Value: {1}", reader.TokenType, reader.Value);
}
else
{
Console.WriteLine("Token: {0}", reader.TokenType);
}
}
// Token: StartObject
// Token: PropertyName, Value: CPU
// Token: String, Value: Intel
// Token: PropertyName, Value: PSU
// Token: String, Value: 500W
// Token: PropertyName, Value: Drives
// Token: StartArray
// Token: String, Value: DVD read/writer
// Token: Comment, Value: (broken)
// Token: String, Value: 500 gigabyte hard drive
// Token: String, Value: 200 gigabype hard drive
// Token: EndArray
// Token: EndObject
将动态对象(ExpandoObject)序列化为JSON
没有什么比使用Javascript对象更好的了, 这是一种令人愉快的体验, 因为它们非常灵敏, 可以让你做任何事情并保存。但是, 对于使用c#中的动态对象的Javascript开发人员来说, 哪个更好?
以下示例与使用ExpandoObject用C#编写javascript最为相似, 该示例允许你像javascript一样向对象添加动态属性。
注意:序列化支持几乎所有类型的对象, 不仅支持expando类型。
using System.Dynamic;
dynamic myObject = new ExpandoObject();
myObject.name = "Our Code World";
myObject.website = "http://ourcodeworld.com";
myObject.language = "en-US";
List<string> articles = new List<string>();
articles.Add("How to manipulate JSON with C#");
articles.Add("Top 5: Best jQuery schedulers");
articles.Add("Another article title here ...");
myObject.articles = articles;
string json = JsonConvert.SerializeObject(myObject);
Console.WriteLine(json);
//{
// "name":"Our Code World", // "website":"http://ourcodeworld.com", // "language":"en-US", // "articles":[
// "How to manipulate JSON with C#", // "Top 5: Best jQuery schedulers", // "Another article title here ..."
// ]
//}
将JSON字符串反序列化为部分类
你可以读取JSON字符串并将其解析为现有的c#类, 而不是按属性读取它。使用DeserializeObject方法。
在这种情况下, 该类将命名为SearchResult, 并且具有以下结构:
public class SearchResult
{
public string Title { get; set; }
public string Content { get; set; }
public string Url { get; set; }
}
现在, 处理它的代码应如下所示:
using Newtonsoft.Json.Linq;
string googleSearchText = @"{
'responseData': {
'results': [
{
'GsearchResultClass': 'GwebSearch', 'unescapedUrl': 'http://en.wikipedia.org/wiki/Paris_Hilton', 'url': 'http://en.wikipedia.org/wiki/Paris_Hilton', 'visibleUrl': 'en.wikipedia.org', 'cacheUrl': 'http://www.google.com/search?q=cache:TwrPfhd22hYJ:en.wikipedia.org', 'title': '<b>Paris Hilton</b> - Wikipedia, the free encyclopedia', 'titleNoFormatting': 'Paris Hilton - Wikipedia, the free encyclopedia', 'content': '[1] In 2006, she released her debut album...'
}, {
'GsearchResultClass': 'GwebSearch', 'unescapedUrl': 'http://www.imdb.com/name/nm0385296/', 'url': 'http://www.imdb.com/name/nm0385296/', 'visibleUrl': 'www.imdb.com', 'cacheUrl': 'http://www.google.com/search?q=cache:1i34KkqnsooJ:www.imdb.com', 'title': '<b>Paris Hilton</b>', 'titleNoFormatting': 'Paris Hilton', 'content': 'Self: Zoolander. Socialite <b>Paris Hilton</b>...'
}
], 'cursor': {
'pages': [
{
'start': '0', 'label': 1
}, {
'start': '4', 'label': 2
}, {
'start': '8', 'label': 3
}, {
'start': '12', 'label': 4
}
], 'estimatedResultCount': '59600000', 'currentPageIndex': 0, 'moreResultsUrl': 'http://www.google.com/search?oe=utf8&ie=utf8...'
}
}, 'responseDetails': null, 'responseStatus': 200
}";
JObject googleSearch = JObject.Parse(googleSearchText);
// get JSON result objects into a list
IList<JToken> results = googleSearch["responseData"]["results"].Children().ToList();
// serialize JSON results into .NET objects
IList<SearchResult> searchResults = new List<SearchResult>();
foreach (JToken result in results)
{
SearchResult searchResult = JsonConvert.DeserializeObject<SearchResult>(result.ToString());
searchResults.Add(searchResult);
}
// List the properties of the searchResults IList
foreach (SearchResult item in searchResults)
{
Console.WriteLine(item.Title);
Console.WriteLine(item.Content);
Console.WriteLine(item.Url);
}
// Title = <b>Paris Hilton</b> - Wikipedia, the free encyclopedia
// Content = [1] In 2006, she released her debut album...
// Url = http://en.wikipedia.org/wiki/Paris_Hilton
// Title = <b>Paris Hilton</b>
// Content = Self: Zoolander. Socialite <b>Paris Hilton</b>...
// Url = http://www.imdb.com/name/nm0385296/
你可以在此处阅读更多示例以访问官方文档。玩得开心
评论前必须登录!
注册