C#中反序列化格式特殊的汇率API JSON至对象的问题
解决带特殊格式JSON键的C#反序列化问题
嘿,这个坑我太熟了!那些带序号、空格甚至特殊符号的JSON键确实会让自动生成的类直接报错——毕竟C#的属性名可不能以数字开头或者带空格。不过咱们完全不用妥协,用C#的序列化特性就能完美映射,轻松解决问题。
我分两种主流的JSON序列化库给你讲解决方案,你根据自己项目用的库来选就行:
方案1:用.NET自带的System.Text.Json(.NET Core/.NET 5+默认)
首先,你需要定义一个符合C#语法的类,然后通过[JsonPropertyName]特性把合法的属性名和JSON里的特殊键对应起来。比如假设你的JSON返回是这样的:
{
"1. From_CurrencyCode": "USD",
"2. To_CurrencyCode": "EUR",
"3. Exchange_Rate": "0.92"
}
那对应的C#类可以这么写:
using System.Text.Json.Serialization; public class ExchangeRateResponse { // 用特性指定对应的JSON键名 [JsonPropertyName("1. From_CurrencyCode")] public string FromCurrencyCode { get; set; } [JsonPropertyName("2. To_CurrencyCode")] public string ToCurrencyCode { get; set; } [JsonPropertyName("3. Exchange_Rate")] public decimal ExchangeRate { get; set; } }
之后反序列化的时候就正常用JsonSerializer就行:
// 假设apiResponse是你从接口拿到的JSON字符串 var rateData = JsonSerializer.Deserialize<ExchangeRateResponse>(apiResponse); // 现在你可以直接用rateData.FromCurrencyCode这种规范的属性名访问数据啦
方案2:用Newtonsoft.Json(Json.NET,老牌常用库)
如果你的项目用的是Newtonsoft.Json(比如老.NET Framework项目或者依赖了它的其他功能),那就用[JsonProperty]特性来做映射,逻辑和上面类似:
using Newtonsoft.Json; public class ExchangeRateResponse { [JsonProperty("1. From_CurrencyCode")] public string FromCurrencyCode { get; set; } [JsonProperty("2. To_CurrencyCode")] public string ToCurrencyCode { get; set; } [JsonProperty("3. Exchange_Rate")] public decimal ExchangeRate { get; set; } }
反序列化代码:
var rateData = JsonConvert.DeserializeObject<ExchangeRateResponse>(apiResponse);
小提醒
- 完全不用管json2csharp生成的那些不符合语法的属性名,直接改成符合C#帕斯卡命名法的名字,再用特性映射就好。
- 如果不确定自己用的是哪个序列化库,看项目依赖:.NET Core 3.0+默认引用了System.Text.Json,而Newtonsoft.Json需要手动安装NuGet包。
内容的提问来源于stack exchange,提问作者Kim Karlsson
相关产品推荐
相关产品推荐

