You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何转义关键字访问BlockCypher API返回的JSON字段

解决C#中JSON字段名与关键字冲突的问题

嘿,这个问题我之前也碰到过!当JSON里的字段名刚好撞上C#的关键字时,确实挺闹心的,不过有几个靠谱的解决方案可以选:

1. 用@符号直接转义关键字

C#允许在标识符前加@来转义关键字,编译器会把它当作普通变量名处理,这是最省事的改法:

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(endpoint);
if (response.IsSuccessStatusCode)
{
    string json = await response.Content.ReadAsStringAsync();
    dynamic dynamicJson = JsonConvert.DeserializeObject(json);
    return new MyAddress()
    {
        Address = (string)dynamicJson.address,
        PublicKey = (string)dynamicJson.@public, // 加@转义关键字
        PrivateKey = (string)dynamicJson.@private // 加@转义关键字
    };
}

2. 使用索引器访问字段

就像你提到的,直接用字符串索引访问dynamic对象的属性,完全避开关键字的限制:

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(endpoint);
if (response.IsSuccessStatusCode)
{
    string json = await response.Content.ReadAsStringAsync();
    dynamic dynamicJson = JsonConvert.DeserializeObject(json);
    return new MyAddress()
    {
        Address = (string)dynamicJson.address,
        PublicKey = (string)dynamicJson["public"], // 索引器方式访问
        PrivateKey = (string)dynamicJson["private"] // 索引器方式访问
    };
}

这种方式不仅能解决关键字问题,遇到带特殊字符的字段名也同样适用。

3. 强类型实体类(生产环境推荐)

如果是正式项目,更建议用强类型实体类配合JsonProperty特性做字段映射,既能避开关键字问题,还能获得编译时类型检查,减少运行时错误:

先定义对应的实体类:

public class BlockCypherAddress
{
    [JsonProperty("address")]
    public string Address { get; set; }

    [JsonProperty("public")] // 映射JSON的"public"字段
    public string PublicKey { get; set; }

    [JsonProperty("private")] // 映射JSON的"private"字段
    public string PrivateKey { get; set; }
}

然后修改反序列化代码:

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(endpoint);
if (response.IsSuccessStatusCode)
{
    string json = await response.Content.ReadAsStringAsync();
    var cypherAddress = JsonConvert.DeserializeObject<BlockCypherAddress>(json);
    return new MyAddress()
    {
        Address = cypherAddress.Address,
        PublicKey = cypherAddress.PublicKey,
        PrivateKey = cypherAddress.PrivateKey
    };
}

这种方式的优势很明显:代码更健壮,IDE能提供属性补全提示,后期维护也更方便。

总结

  • 快速测试或小脚本场景,用@转义或索引器访问最快捷;
  • 正式项目优先选强类型实体类,安全性和可维护性更高。

内容的提问来源于stack exchange,提问作者Eutherpy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:47:27