【问题标题】:object to deserialize has a C# keyword要反序列化的对象具有 C# 关键字
【发布时间】:2023-03-10 12:35:01
【问题描述】:

按照原样定义 JSON,为了将其反序列化为对象,我需要在我的类上创建一个名为“event”的属性,这是一个 C# 关键字。还有其他方法可以告诉它字段名称是什么吗?

这是 JSON 的一个示例:

{ 事件:123 数据: {"data":"0D0401","ttl":"60","published_at":"2014-04-16T18:04:42.446Z","id":"48ff6f065067555031192387"} }

以下是由于关键字而无法编译的类:

public class Event
{
    public int event { get; set; }
    public EventDetail data { get; set; }
}

public class EventDetail
{
    public string data { get; set; }
    public string ttl { get; set; }
    public DateTime published_at { get; set; }
    public string id { get; set; }
}

【问题讨论】:

  • 尝试在标识符public int @event的开头放一个@符号

标签: c# json object serialization keyword


【解决方案1】:

改变

public class Event
{
    public int event { get; set; }
    public EventDetail data { get; set; }
}

到这里

public class Event
{
    public int @event { get; set; }
    public EventDetail data { get; set; }
}

这个技巧展示了在 C# 中转义所涉及的怪癖:

  • 字符文字转义

例如'\''、'\n'、'\u20AC'(欧元欧元货币符号)、'\x9'

(相当于\t)) - 文字字符串转义:

例如“...\t...\u0040...\U000000041...\x9...”

  • 逐字转义:

例如@"...""..."

  • string.Format 转义:

例如“...{{...}}...”

  • 关键字转义:

例如@if (for if 作为标识符)

  • 标识符转义:

例如i\u0064(用于 id)

【讨论】:

    【解决方案2】:

    尝试在相关属性上使用[DataContract(Name = "@event")] 属性。然后它将正确(反)序列化,您可以重命名该属性以使其编译。

    【讨论】:

    • 但是我必须包含 System.Runtime.Serialization 命名空间,否则就不需要了。 Newtonsoft.Json 是否支持 DataContractDataMember 属性?
    • 我相信是的。我自己在代码中使用它们来调用 REST API,我相信 HTTP 客户端库在幕后使用 Newtonsoft.Json
    • 嘿,这很酷。它像你说的那样工作。不知道你对 HTTP 的意思...我只是使用 Event obj = JsonConvert.DeserializeObject<Event>(string) 来反序列化它。
    • 不管 HTTP 客户端,只要它可以工作 :)
    • 更好的是,我发现我可以使用 JsonProperty 属性来定义字段名称,如这篇文章:[link]stackoverflow.com/questions/4671044/…。而且我不需要#include 序列化命名空间。
    【解决方案3】:

    我能够将“e”大写,它仍然有效。看起来解析机制是不区分大小写的。

    【讨论】:

      【解决方案4】:

      无论如何,有人会重新审视这个...... 在 DotNet 3.1 using System.Text.Json.Serialization 中使用属性

      [JsonPropertyName("TheNameItHasInJsonFile")]
      public int Something {get;set;}
      

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 2021-02-11
        • 2022-12-15
        • 1970-01-01
        • 2014-09-06
        相关资源
        最近更新 更多