C#网络请求与JSON解析的示例代码

下面是详细攻略:

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提供的DefaultRequestHeadersUri参数进行配置。

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提供的DefaultRequestHeadersAdd方法进行配置。

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技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • ASP.NET MVC文件上传教程(二)

    下面是详细讲解“ASP.NET MVC文件上传教程(二)”的完整攻略: ASP.NET MVC文件上传教程(二) 一、前言 在Web开发中,文件上传是一个非常常见的需求,比如我们需要上传头像、附件、图片等等,这时候就需要用到文件上传功能。ASP.NET MVC框架本身提供了文件上传的功能,我们可以轻松实现文件上传。 在上一篇教程中,我们讲解了如何生成表单并获…

    C# 2023年5月31日
    00
  • Python调用.NET库的方法步骤

    当我们使用Python编程时,有时需要从.NET库里调用一些方法。那么,下面是我总结的Python调用.NET库的方法步骤: 安装pythonnet库 要使用Python调用.NET库,首先需要安装一个名叫pythonnet的Python库。你可以使用pip安装该库,命令如下: pip install pythonnet 导入.NET dll并创建实例 在P…

    C# 2023年6月3日
    00
  • C#反射在实际应用中的实例代码

    C#反射在实际应用中非常重要。它使得我们能够在程序运行时动态地获取其类型信息并且访问其成员。接下来,我们将通过两个示例来演示如何在实际应用中使用C#反射以获取类型信息并且访问类型成员。 示例一:获取程序集中所有类型的名称 我们可以使用System.Reflection命名空间提供的类型来获取一个程序集中所有包含的类型名称: using System.Refl…

    C# 2023年5月31日
    00
  • C#实现通过winmm.dll控制声音播放的方法

    下面是“C#实现通过winmm.dll控制声音播放的方法”的完整攻略: 1.简介 Winmm.dll是Windows操作系统中的一个动态链接库文件,它包含了负责音频的相关函数,通过调用这些函数我们可以实现对音频的控制。本文将介绍C#通过调用winmm.dll实现控制声音播放的方法。 2.winmm.dll 函数介绍 首先,我们需要了解winmm.dll中的一…

    C# 2023年5月15日
    00
  • ASP.NET Core Api网关Ocelot的使用初探

    下面是“ASP.NET Core Api网关Ocelot的使用初探”的完整攻略: 什么是ASP.NET Core Api网关Ocelot? ASP.NET Core Api网关Ocelot是一个开源的API网关,用于管理和路由HTTP请求。它提供了一组API和UI组件,用于配置和管理API网关,包括路由、认证、授权、限流、缓存等方面。 如何使用ASP.NET…

    C# 2023年5月16日
    00
  • C#用websocket实现简易聊天功能(客户端)

    下面是C#用websocket实现简易聊天功能(客户端)的完整攻略。 1. 准备工作 在开始实现聊天功能之前,你需要先准备好以下几件事情: 安装websocket库:你可以通过在Visual Studio中打开NuGet包管理器,然后搜索websocket来安装websocket库。 了解websocket连接的基本知识:websocket是一种基于TCP协…

    C# 2023年5月15日
    00
  • 使用位运算实现网页中的过滤、筛选功能实例

    使用位运算实现网页中的过滤、筛选功能,通常适用于多选项、多条件的情况下,可以大大提高筛选的效率和处理速度。下面我会给出一个完整攻略,包含示例说明。 步骤一:建立数据标记规则 在使用位运算进行网页过滤、筛选时,首先要建立数据标记规则。这个规则可以是二进制中的 1 和 0,也可以是其他数字、字符等。 例如,在一家电商网站中,有多个筛选条件,比如价格、品牌、颜色、…

    C# 2023年6月7日
    00
  • C# 如何调用C++ dll string类型返回

    调用C++ DLL是C#中常见的需求,本攻略将介绍如何在C#中调用C++的DLL,并且C++ DLL中的函数返回string类型的值。 准备工作 在进行调用C++ DLL前,需要做以下几个准备工作: 确保已经有C++ DLL文件。 确保已经有C++头文件和源文件,用于生成DLL文件。 确保已经有C#工程,用于引用C++ DLL。 C++ DLL的实现 以下是…

    C# 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部