下面是详细攻略:
1. C#网络请求
1.1 发送GET请求
1.1.1 示例说明
以获取百度首页HTML为例,这里采用HttpClient
发送GET请求:
using System;
using System.Net.Http;
class Program
{
static async Task Main(string[] args)
{
using (var client = new HttpClient())
{
var response = await client.GetAsync("https://www.baidu.com");
var html = await response.Content.ReadAsStringAsync();
Console.WriteLine(html);
}
}
}
代码解释:
首先利用using
关键字创建HttpClient
实例,通过调用该实例的GetAsync
方法发送GET请求并等待响应结果返回。返回的response
对象中包含响应头和响应体,这里只取其响应体部分并异步读取为字符串类型的html
变量,最后将其打印在控制台上。
1.1.2 注意事项
在实际应用场景中,如果需要设置请求头、请求参数等信息,可利用HttpClient
提供的DefaultRequestHeaders
和Uri
参数进行配置。
1.2 发送POST请求
1.2.1 示例说明
以向GitHub API发送POST请求为例,假设需要通过用户名和密码获取访问令牌:
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
class Program
{
static async Task Main(string[] args)
{
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
httpClient.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter");
var requestJson = new
{
note = "my token",
scopes = new[] {"repo", "user"}
};
var requestBody = new StringContent(
JsonSerializer.Serialize(requestJson),
Encoding.UTF8,
"application/json");
var response = await httpClient.PostAsync(
"https://api.github.com/authorizations",
requestBody
);
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
}
代码解释:
首先实例化HttpClient
,并设置请求头信息。构建请求JSON对象,并将其序列化为JSON字符串类型的请求体。然后发送POST请求到GitHub API,等待响应并异步读取响应体内容,最后将其输出到控制台。
1.2.2 注意事项
在实际应用场景中,如果需要设置更多的请求头信息,如Cookie、Authorization、Referer等,可利用HttpClient
提供的DefaultRequestHeaders
和Add
方法进行配置。
2. JSON解析
2.1 Json.NET
Newtonsoft.Json(Json.NET)是一个.NET平台上的高性能JSON框架,它提供简单而又灵活的API,方便实用。下面详细介绍Json.NET的使用。
2.1.1 示例说明
以解析示例JSON字符串为例,假设JSON字符串如下:
{
"name": "apple",
"colors": ["red", "green", "yellow"],
"weight": 75.5,
"is_on_sale": true,
"inventory": null,
"country": "China",
"description": {
"zh": "苹果是一种常见的水果",
"en": "Apple is a common fruit"
}
}
我们可以通过下列代码解析JSON字符串:
using System;
using Newtonsoft.Json.Linq;
class Program
{
static void Main(string[] args)
{
string jsonString = "{\"name\":\"apple\",\"colors\":[\"red\",\"green\",\"yellow\"],\"weight\":75.5,\"is_on_sale\":true,\"inventory\":null,\"country\":\"China\",\"description\":{\"zh\":\"苹果是一种常见的水果\",\"en\":\"Apple is a common fruit\"}}";
JObject jobject = JObject.Parse(jsonString);
string name = jobject["name"].ToString();
JArray colors = (JArray)jobject["colors"];
float weight = (float)jobject["weight"];
bool isOnSale = (bool)jobject["is_on_sale"];
string country = jobject["country"].ToString();
JObject description = (JObject)jobject["description"];
Console.WriteLine($"Name: {name}");
Console.WriteLine($"Colors: {string.Join(", ", colors)}");
Console.WriteLine($"Weight: {weight}");
Console.WriteLine($"IsOnSale: {isOnSale}");
Console.WriteLine($"Country: {country}");
Console.WriteLine($"Description:");
Console.WriteLine($" `zh`:{description["zh"]}");
Console.WriteLine($" `en`:{description["en"]}");
}
}
代码解释:
首先构造JSON字符串存储在字符串变量中,接着采用Json.NET提供的JObject.Parse
方法将JSON字符串转换为JObject
对象。然后通过使用[]
索引器访问JObject
对象中各项属性值,或者通过显式类型转换获取更具体的类型值。
2.1.2 注意事项
在实际应用场景中,如果获取到的JSON数据结构比较复杂,建议使用Json.NET提供的JToken.SelectToken
进行路径式的访问,对应的返回类型是JToken
对象。
2.2 System.Text.Json
.NET Core 3.0及以上支持自带的JSON处理库System.Text.Json。下面详细介绍System.Text.Json的使用。
2.2.1 示例说明
以解析示例JSON字符串为例,假设JSON字符串如下:
{
"name": "apple",
"colors": ["red", "green", "yellow"],
"weight": 75.5,
"is_on_sale": true,
"inventory": null,
"country": "China",
"description": {
"zh": "苹果是一种常见的水果",
"en": "Apple is a common fruit"
}
}
我们可以通过下列代码解析JSON字符串:
using System;
using System.Text.Json;
class Program
{
static void Main(string[] args)
{
string jsonString = "{\"name\":\"apple\",\"colors\":[\"red\",\"green\",\"yellow\"],\"weight\":75.5,\"is_on_sale\":true,\"inventory\":null,\"country\":\"China\",\"description\":{\"zh\":\"苹果是一种常见的水果\",\"en\":\"Apple is a common fruit\"}}";
var jsonDoc = JsonDocument.Parse(jsonString);
string name = jsonDoc.RootElement.GetProperty("name").GetString();
JsonElement colorsJsonElement = jsonDoc.RootElement.GetProperty("colors");
float weight = jsonDoc.RootElement.GetProperty("weight").GetSingle();
bool isOnSale = jsonDoc.RootElement.GetProperty("is_on_sale").GetBoolean();
string country = jsonDoc.RootElement.GetProperty("country").GetString();
JsonElement descriptionJsonElement = jsonDoc.RootElement.GetProperty("description");
JsonElement zhDescriptionJsonElement = descriptionJsonElement.GetProperty("zh");
JsonElement enDescriptionJsonElement = descriptionJsonElement.GetProperty("en");
var colors = new List<string>();
foreach (var color in colorsJsonElement.EnumerateArray())
{
colors.Add(color.GetString());
}
Console.WriteLine($"Name: {name}");
Console.WriteLine($"Colors: {string.Join(", ", colors)}");
Console.WriteLine($"Weight: {weight}");
Console.WriteLine($"IsOnSale: {isOnSale}");
Console.WriteLine($"Country: {country}");
Console.WriteLine($"Description:");
Console.WriteLine($" `zh`: {zhDescriptionJsonElement.GetString()}");
Console.WriteLine($" `en`: {enDescriptionJsonElement.GetString()}");
}
}
代码解释:
首先构造JSON字符串存储在字符串变量中,接着采用System.Text.Json提供的JsonDocument.Parse
方法将JSON字符串转换为JsonDocument
对象。然后通过使用GetProperty
方法访问JsonDocument
对象中各项属性值,或者使用EnumerateArray
方法进行遍历获取数组类型的值。
2.2.2 注意事项
在实际应用场景中,System.Text.Json和Json.NET的使用方式比较类似,但存在一些语法上的不同之处,需要进行注意。此外,System.Text.Json不支持路径式的访问,如需进行复杂JSON结构的操作,则建议使用Json.NET。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#网络请求与JSON解析的示例代码 - Python技术站