C#解析JSON数据全攻略

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

本文将手把手教你用C#轻松玩转JSON数据:- HttpClient获取网络JSON数据- System.Text.Json动态解析技巧- 强类型模型转换实战- 特殊字符/日期格式处理方案- 完整可运行代码示例

🔍 一、为什么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数据全攻略 - 曲幽 - 博客园

体验地址:JNPF快速开发平台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916011.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8-大语言模型—指令理解:基于 LoRA 的大语言模型指令微调框架

目录 1、模型上下文窗口 1.1、增加上下文窗口的微调&#xff08;Fine-tuning for Longer Context&#xff09; 1.1.1、 核心目标 1.1.2、关键步骤 &#xff08;1&#xff09;数据准备&#xff1a;构建长文本训练集 &#xff08;2&#xff09;微调策略&#xff1a;分阶段适…

工业数据中台:PLC、SCADA、MES 的实时协同架构

在智能制造升级过程中&#xff0c;工业数据的互联互通是突破生产效率瓶颈的关键。PLC&#xff08;可编程逻辑控制器&#xff09;掌控着设备的实时运行参数&#xff0c;SCADA&#xff08;监控与数据采集系统&#xff09;负责车间级的状态监控&#xff0c;MES&#xff08;制造执行…

【Golang】Go语言基础语法

Go语言基础语法 文章目录Go语言基础语法一、Go标记二、行分隔符三、注释四、标识符五、字符串连接六、关键字七、Go语言的空格八、格式化字符串一、Go标记 Go程序可以由多个标记组成吗&#xff0c;可以是关键字、标识符、常量、字符串、符号。如下Go语句由6个标记组成&#xf…

WebRTC指纹——深度分析(中篇)

1. 引言 在上篇中,我们建立了WebRTC审查规避系统分析的理论基础,探讨了技术背景和威胁模型。中篇将深入分析WebRTC协议栈中的具体识别特征,通过对多个主流WebRTC应用的实际协议分析,揭示不同实现之间存在的显著差异。 这些协议层面的特征差异构成了审查系统进行指纹识别的…

谷粒商城篇章13--P340-P360--k8s/KubeSphere【高可用集群篇一】

1 k8s 1.1 简介 Kubernetes 简称 k8s。 是用于自动部署&#xff0c; 扩展和管理容器化应用程序的开源系统。 中文官网&#xff1a; https://kubernetes.io/zh/ 中文社区&#xff1a; https://www.kubernetes.org.cn/ 官方文档&#xff1a; https://kubernetes.io/zh/docs/h…

从零搭建 OpenCV 项目(新手向)-- 第二天 OpenCV图像预处理(一)

目录 一、图像翻转&#xff08;镜像翻转&#xff09; 1. 定义 2. OpenCV 函数 3. 数学表达 二、图像仿射变换 1. 定义 2. 仿射变换的基本原理 3. OpenCV 函数 4. 图像旋转 5. 图像平移 6. 图像缩放 7. 图像剪切 8. 为什么会出现黑色背景&#xff1f; 三、图像色彩…

贪心算法Day6学习心得

第一道&#xff1a;738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09; 这道题目暴力算法肯定是最容易想到的&#xff0c;先附上暴力的代码&#xff1a; class Solution { private:// 判断一个数字的各位上是否是递增bool checkNum(int num) {int max 10;while (n…

数据的评估与清洗篇---上手清理索引和列名

重命名索引和列名 在读取数据时,如果我们发现数据的索引或者列名乱七八糟的,可以使用DataFrame的rename方法对它们进行重新命名。 df1.rename(index={...})df1.rename(columns={...}) 重命名索引 如果想改索引就把可选参数index指定为一个字典,针对索引,把要修改…

【ICML2025】时间序列|TimePro:炸裂!线性复杂度实现高效长程多元时间序列预测!

论文地址&#xff1a;https://arxiv.org/pdf/2505.20774 代码地址&#xff1a;https://github.com/xwmaxwma/TimePro 为了更好地理解时间序列模型的理论与实现&#xff0c;推荐参考UP “ThePPP时间序列” 的教学视频。该系列内容系统介绍了时间序列相关知识&#xff0c;并提供配…

2025真实面试试题分析-iOS客户端开发

以下是对iOS客户端开发工程师面试问题的分类整理、领域占比分析及高频问题精选&#xff08;基于​​85道问题&#xff0c;总出现次数118次​​&#xff09;。按技术领域整合为​​7大核心类别​​&#xff0c;按占比排序并精选高频问题标注优先级&#xff08;1-5&#x1f31f;&…

计算机网络简答题(大雪圣期末参考资料)

1、网络性能指标/计算机网络有哪些常用的性能指标&#xff1f;答&#xff1a;速率&#xff0c;带宽&#xff0c;吞吐量&#xff0c;时延&#xff08;发送时延、传播时延、处理时延、排队时延&#xff09;&#xff0c;时延带宽积&#xff0c;往返时间RTT和信道&#xff08;或网络…

红宝书单词学习笔记 list 76-100

list 76NO.WordMeaning1staleadj. 不新鲜的&#xff1b;陈腐的2stalln. 小隔间&#xff1b;摊位&#xff1b;牲畜棚&#xff1b;v. 停顿&#xff1b;(使) 熄火&#xff1b;故意拖延3staplen. 订书钉&#xff1b;主要产品&#xff1b;主要部分&#xff1b;主食&#xff1b;v. 用…

Vue3 学习教程,从入门到精通,Vue 3 计算属性(Computed Properties)知识点详解与案例代码(15)

Vue 3 计算属性&#xff08;Computed Properties&#xff09;知识点详解与案例代码 在 Vue 3 中&#xff0c;计算属性&#xff08;Computed Properties&#xff09; 是用于基于响应式数据派生新数据的一种方式。计算属性具有以下特点&#xff1a; 缓存性&#xff1a;只有在依赖…

2.5 PN-PTCP

Profinet Precision Transparent Clock Protocol (PN-PTCP) PN-PTCP&#xff08;精确透明时钟协议&#xff09;是一种专用于 Profinet 的 二层协议&#xff0c;其作用是为网络中的设备提供高精度的时间同步。用于实现网络设备的高精度时间同步。

WordPress与Typecho站点CloudFlare缓存优化实战指南

文章目录 WordPress与Typecho站点CloudFlare缓存加速全攻略 引言 一、CloudFlare缓存基础原理 1.1 CloudFlare工作流程 1.2 缓存类型 二、基础配置指南 2.1 CloudFlare账户设置 2.2 缓存配置 2.3 页面规则设置 三、高级缓存策略 3.1 动态内容缓存 WordPress方案: Typecho方案:…

【OpenCV实现多图像拼接】

文章目录1 OpenCV 图像拼接核心原理2 OpenCV 图像拼接实现代码方法一&#xff1a;使用 OpenCV 内置 Stitcher 类&#xff08;推荐&#xff09;方法二&#xff1a;手动实现核心步骤关键参数说明3 常见问题处理4 增量式图像拼接&#xff08;Incremental Image Stitching&#xff…

haproxy 算法

一、静态算法按照事先定义好的规则轮询公平调度&#xff0c;不关心后端服务器的当前负载、连接数和响应速度 等&#xff0c;且无法实时修改权重(只能为0和1,不支持其它值)&#xff0c;只能靠重启HAProxy生效。(不管后端死活&#xff09;1.1、static-rr&#xff1a;基于权重的轮…

Go 的第一类对象与闭包

1. Go 的第一类对象&#xff08;First-Class Citizens&#xff09; 什么是第一类对象&#xff1f; 第一类对象是指能够像 普通值 一样使用的对象&#xff0c;通常可以赋值给变量、传递给函数、作为函数返回值等。在很多编程语言中&#xff0c;函数本身不被视为第一类对象&#…

深度分析Android多线程编程

理解并正确运用多线程是构建高性能、流畅、响应迅速的 Android 应用的关键&#xff0c;但也充满挑战和陷阱。 核心挑战&#xff1a;UI 线程&#xff08;主线程&#xff09;的限制 唯一性&#xff1a; Android 应用只有一个主线程&#xff0c;负责处理所有用户交互&#xff08;触…

uniapp在app中关于解决输入框键盘弹出后遮住输入框问题

问题描述&#xff1a; uniapp的app中&#xff0c;当表单页面过长时&#xff0c;点击下方的输入框时&#xff0c;弹出键盘后会把输入框给挡住&#xff0c;导致看不到输入内容。 解决方案&#xff1a; 在page.json中&#xff0c;找到此页面的配置&#xff0c;加上style中的softin…