C#解析JSON数据全攻略指南

2025-07-22 19:50

本文主要是介绍C#解析JSON数据全攻略指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...

还在为C#处理网络API返回的复杂JSON数据头疼吗?据统计,90%的开发者都曾在JSON解析上栽过跟头!

本文将手把手教你用C#轻松玩转JSON数据:

- HttpClient获取网络JSON数据

- System.Text.Json动态解析技巧

- 强类型模型转换js实战

- 特殊字符/日期格式处理方案

- 完整可运行代码示例

一、为什么JSON是C#开发必修课?

现代Web API中95%的数据交换采用JSON格式。无论是调用天气API、支付接口,还是处理云服务返回数据,JSON解析都是核心技能!

二、四步搞定网络JSON数据

1. 获取数据 - HttpClient最佳实践

using var httpClient = new HttpClient();
var response = await httpClient.GetAsync("https://api.example.com/data");
var jsonString = await response.Content.ReadAsStringAsync();

关键点:使用using自动释放资源,异步方法提升性能

2. 动态解析 - 快速读取字段

using System.Text.Json;
var jsonDoc = JsonDocument.Parse(jsonString);
string name = jsonDoc.RootElement
                .GetProperty("user")
                .GetProperty("name")
                .GetString();

适用场景:快速提取少量字段,无需创建完整模型

3. 强类型解析 - 推荐方案!

public class User {
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime RegisterDate { get; set; }
}

var user = JsonSerializer.Deserialize<User>(jsonString, new JsonSerializerOptions {
    PropertyNameCaseInsensitive = true // 忽略大小写
});

优势:编译时检查 + 智能提示 + 高可维护性

4. 特殊场景处理

日期格式转换:

options.Converters.Add(new DateTimeConverter("yyyy-MM-dd"));

处理JSON注释:

options.ReadCommentHandling = JsonCommentHandling.Skip;

三、避坑指南

- NULL引用异常:给属性设置默认值 public string Name { get; set; } = string.Empty;

- 字段缺失:使用[JsonIgnore]忽略不存在的属性

- 性能陷阱:大文件解析用JsonDocument替代JObject

四、完整代码示例

using System.Text.Json;

public async Task<WeatherData> GetWeatherAsync() {
    using var httpClient = new HttpClient();
    
    // 获取杭州天气数据
    var response = await httpClient.GetAsync(
        "https://api.weather.com/v3?location=hangzhou");
    
    response.EnsureSuccessStatusCode();
    var json = await response.Content.ReadAsStringAsync();
    
    // 强类型解析
    return JsonSerializer.Deserialize<WeatherData>(json, new JsonSerializerOptions {
        PropertyNameCaseInsensitive = true,
        NumberHandling = JsonNumberHandling.AllowReadingFromString
    });
}

// 定义数据模型
public class WeatherData {
    public string Location { get; set; } = string.Empty;
    public double Temperature { get; set; }
    public string Unit { get; set; } = "Celsius";
    [JsonPropertyName("wind_speed")]
    public double WindSpeed { get; set; }
}

五、知识延展

C#中处理JSON数据的方式

1.将对象序列化为JSON字符串

在C#中,可以使用System.Text.JsonNewtonsoft.Json这两个流行的库来将对象序列化为JSON字符串。以下是使用这两个库进行序列化的示例代码:

using System;
using System.Text.Json;
using Newtonsoft.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Program
{
    public static void Main()
    {
        Person person = new Person { Name = "John Doe", Age = 30 };

        // 使用System.Text.Json库进行序列化
        string json1 = JsonSerializer.Serialize(person);
        Console.WriteLine(json1);

        // 使用Newtonsoft.Json库进行序列化
        string json2 = JsonConvert.SerializeObject(person);
        Console.WriteLine(json2);
    }
}

2.将JSON字符串反序列化为对象

与将对象序列化为JSON字符串相反,C#中也可以使用System.Texhttp://www.chinasem.cnt.JsonNewtonsoft.Json来将JSON字符串反序列化为对象。以下是使用这两个库进行反序列化的示例代码:

using System;
using System.Text.Json;
using Newtonsoft.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Program
{
    public static void Main()
    {
        string json = "{\"Name\":\"John Doe\",\"Age\":30}";

        // 使用System.Text.Json库进行反序列化
        Person person1 = JsonSerializer.Deserialize<Person>(json);
        Console.WriteLine(person1.Name);
        Console.WriteLine(person1.Age);

        // 使用Newtonsoft.Json库进行反序列化
        Person person2 = JsonConvert.DeserializeObject<Person>(json);
        Console.WriteLine(person2.Name);
        Console.WriteLine(person2.Age);
    }
}

3.对JSON进行查询和筛选

在C#中,我们可以使用LINQ(Language-Integrated Query)来对JSON进行查询和筛选。通过使用SelectToken方法和JsonPath表达式,我们可以方便地访问和操作嵌套的JSON属性。以下是一个使用LINQ查询和筛选JSON的示例:

using System;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        string json = "{\"Name\":\"John Doe\",\"Age\":30,\"Address\":{\"City\":\"New York\",\"Country\":\"USA\"}}";
        JObject obj = JObject.Parse(json);

        // 使用JsonPath表达式查询和筛选JSON
        JToken nameToken = obj.SelectToken("$.Name");
        Console.WriteLine(nameToken.Value<string>());

        JToken addressToken = obj.SelectToken("$.Address");
        Console.WriteLine(addressToken["City"].Value<string>());
        Console.WriteLine(addressToken["Country"].Value<string>());
    }
}

4.使用LINQ操作JSON数据

除了查询和筛选,我们还可以使用LINQ来对JSON数据进行各种操作,例如投影、连接和排序等。以下是一个使用LINQ操作JSON数据的示例:

using System;
using System.Linq;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        string json = "[{\"Name\":\"John Doe\",\"Age\":30},{\"Name\":\"Jane Smith\",\"Age\":35}]";
        JArray array = JArray.Parse(json);

        // 使用LINQ查询和操作JSON数据
        var names = from item in array
                    select item["Name"].Value<string>();

        foreach (string name in names)
        {
            Console.WriteLine(name);
        }
    }
}

5.处理复杂的嵌套JSON结构

在处理复杂的嵌套JSON结构时,可以使用JObjectJArray类来方便地访问和操作JSON数据。这两个类提供了一系列方法和属性,用于处理嵌套的JSON对象和数组。以下是一个处理复杂嵌套JSON结构的示例:

using System;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        string json = "{\"Name\":\"John Doe\",\"Age\":30,\"Address\":{\"City\":\"New York\",\"Country\":\"USA\"},\"Languages\":[\"C#\",\"JavaScript\"]}";
        JObject obj = JObject.Parse(json);

        Console.WriteLine(obj["Name"].Value<string>());
        Console.WriteLine(obj["Age"].Value<int>());
        Console.WriteLine(obj["Address"]["City"].Value<string>());
        Console.WriteLine(obj["Address"]["Country"].Value<string>());

        foreach (string language in obj["Languages"])
        {
            Console.WriteLine(language);
        }
    }
}

6.处理日期和时间类型的JSON数据

当JSON中包含日期和时间类型的数据时,可以使用DateTimeOffsetJsonConvert类来进行正确的处理和转换。以下是一个处理日期和时间类型的JSON数据的示例:

using System;
using Newtonsoft.Json;

public class Person
{
    public string Name { get; set; }
    public DateTimeOffset BirthDate { get; set; }
}

public class Program
{
    public static void Main()
    {
        string json = "{\"Name\":\"John Doe\",\"BirthDate\":\"1980-01-01T00:00:00+00:00\"}";

        // 使用Newtonsoft.Json处理日期和时间类型
        Person person = JsonConvert.DeserializeObject<Person>(json)http://www.chinasem.cn;
        Console.WriteLine(person.Name);
        Console.WriteLine(person.BirthDate);
    }
}

7.处理JSON中的特殊字符和转义序列

当处理包含特殊字符和转义序列的JSON数据时,可以使用JsonConvert类的EscapeString方法来进行正确的转义。以下是一个处理特殊字符和转义序列的JSON数据的示例:编程

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        string text = @"This is a \"quoted\" text.";
        string json = JsonConvert.SerializeObject(text);

        Console.WriteLine(json); // 输出:"This is a \\\\\"quoted\\\\\" text."
    }
}

8.处理大量的JSON数据

当处理包含大量JSON数据时,可以使用JsonReaderJsonWriter类来实现流式处理,从而减少内存占用和提高性能。以下是一个处理大量JSON数据的示例:

using System;
using System.IO;
using Newtonsoft.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Program
{
    public static void Main()
    {
        string[] names = {"John", "Jane", "Tom", "Alice"};

        using (var stream = new StreamWriter("data.json"))
        using (var writer = new JsonTextWriter(stream))
        {
            writer.WriteStartArray();

            foreach (string name in names)
            {
                var person = new Person {Name = name, Age = 30};
                JsonSerializer.Serialize(writer, person);
            }

            writer.WriteEndArray();
        }
    }
}

9.处理JSON中的异常和错误情况

在处理JSON数据时,可能会遇到各种异常和错误情况。为了确保代码的健壮性和可靠性,应该使用try-catch语句来捕获和处理异常。以下是一个处理JSON异常和错误情况的示例:

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        try
        {
            string invalidJson = "This is not a valid JSON.";
            dynamic obj = JsonConvert.DeserializeObject(invalidJson);
        }
        catch (JsonReaderException ex)
        {
            Console.WriteLine("JSON解析错误:" + ex.Message);
        }
        catch (JsonSerializationException ex)
        {
            Console.WriteLine("JSON序列化错误:" + ex.Message);
        }
    }
}

最佳实践和性能优化建议

在处理JSON数据时,遵循以下最佳实践和性能优化建议可以提高代码的可读性和性能:

  • 尽可能使用System.Text.Json库,它是.NET Core的默认JSON库,性能比Newtonsoft.Json更好。
  • 对于复杂的嵌套JSON结构,使用JObject和JArray类进行访问和操作。
  • 对于大量的JSON数据,使用JsonReader和JsonWriter类进行流式处理。
  • 使用LINQ查询和操作JSON数据,使China编程代码更简洁和可读。
  • 避免在循环内进行重复的JSON序列化和反序列化操作,尽量缓存结果。

到此这篇关于C#解析JSON数据全攻略指南的文章就介绍到这了,更多相关C#解析JSON内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于C#解析JSON数据全攻略指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155449

相关文章

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习