个性化阅读
专注于IT技术分析

如何在C#和WinForms中操作和使用JSON

点击下载

本文概述

由于许多原因, 许多人在网络上使用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性能:

JSON.NET性能比较。

要安装, 请在解决方案资源管理器中右键单击你的项目, 然后选择”管理NuGet软件包”。

CefSharp金块包装经理

当出现搜索菜单时, 键入JSON.NET, 选择WinForms发行版并安装它。

与Visual Studio的每个版本一样, 界面可能有所不同, 只需确保安装位于nuget.org包源中的The Newton.Json by the James Newton-King发行版, 在此示例中, 我们使用的是Visual Studio 2015。

Json.NET NuGet软件包管理器

请遵循安装设置(接受条款并进行安装)。在安装过程中, 你应该在控制台中看到有关该过程的相关信息:

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/

你可以在此处阅读更多示例以访问官方文档。玩得开心

赞(0)
未经允许不得转载:srcmini » 如何在C#和WinForms中操作和使用JSON

评论 抢沙发

评论前必须登录!