本文概述
- 要求
- 安装JSON.NET
- 使用JSON.NET
- JSON比XML所需的标签少-XML项必须包装在打开和关闭标签中, 而JSON仅将标签命名一次。
- JSON更好地帮助基于对象及其值(或方法)的JavaScript中的过程决策。
- JSON比XML更易于阅读(对于许多开发人员而言, 这种情况更少)。
- JSON是值的有序列表。在大多数语言中, 这被实现为数组, 向量, 列表或序列。
- 之间更多…
在本文中学习如何在Windows窗体中使用JSON.NET库以所有方式(读取, 序列化, 反序列化等)来操纵JSON。
要求
- 带NuGet软件包管理器的Visual Studio(> = 2010)。
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%。
文章图片
要安装, 请在解决方案资源管理器中右键单击你的项目, 然后选择” 管理NuGet软件包” 。
文章图片
【如何在C#和WinForms中操作和使用JSON】当出现搜索菜单时, 键入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.nupkgOK https://api.nuget.org/packages/newtonsoft.json.8.0.3.nupkg 27msInstalling 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 listIList<
JToken>
results = googleSearch["responseData"]["results"].Children().ToList();
// serialize JSON results into .NET objectsIList<
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 IListforeach (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/
你可以在此处阅读更多示例以访问官方文档。玩得开心
推荐阅读
- 如何在Symfony 3中访问Rest API
- 如何在Winforms应用程序中使用CefSharp(Chrome嵌入式框架c#)
- 如何在Windows中使用PuTTY在远程服务器(Linux和Ubuntu)上执行.sh脚本
- 什么是FTPS,FTP,SFTP,它们之间有什么区别
- 使用readme.md文件中的Github Markdown可能不知道的提示和技巧
- 使用PHPExcel使用图表生成的Excel文件会因Symfony中的流响应而损坏-PHP
- 如何在Symfony中获取教条查询状态(信息)
- 在Symfony 3中的表单上实现Google reCAPTCHA
- 终极版/反应。实现后,combineReducers无法获得app的状态