【问题标题】:Special characters in property name属性名称中的特殊字符
【发布时间】:2016-08-02 11:36:38
【问题描述】:

在我的应用程序中,网络服务将返回一个 json

{
    "UserDetails": [
      {
        "UserId": "57",
        "EmailId": "prasant@xyz.com",
        "UserName": "Prasant",
        "TimezoneMins": "330",
        "CustomLogo": "",
        "IsExecutive": "True",
        "HasNTID": "1",
        "Org_Id": "1",
        "Org_Name": "Summit",
        "Designation": null,
        "Location": null,
        "Location_Name": "",
        "WsVersion": "V5.1.0",
        "CallMe": "FALSE",
        "GPS": "FALSE",
        "Feedback_IM&SR": "NULL",
        "RPT_Widgets_Access": "False"
      }
    ]   }

在这里,我想将此 json 反序列化为一个类对象。其中类包含与json中的keys相同的属性。

public class UserDetails
    {
        int? _userId;
        string _emailId;
        string _userName;
        int _timezoneMins;
        string _customLogo;
        string _isExecutive;
        int _hasNTID;
        int? _org_Id;
        string _org_Name;
        string _designation;
        int? _location;
        string _location_Name;
        string _feedback_IMSR;
        string _rPT_Widgets_Access;
        public string Feedback_IM&SR
        {
           get{return _feedback_IMSR;}
           set{_feedback_IMSR = value;}
        }

    }

这里的变量和属性“Feedback_IM&SR”有 '&' 字符,这在变量和属性名称中都是不允许的,但我需要该属性的值。

谁能帮帮我。

【问题讨论】:

  • 您是否使用任何特定库将 json 反序列化为您的 c# 类?
  • 你能把Feedback_IM&SR改成Feedback_IM_AND_SR吗?

标签: c# json deserialization special-characters


【解决方案1】:

使用Netwonsoft.NET:

var details = JsonConvert.DeserializeObject<UserDetails>(json);

对于你的类,你需要在你的属性上为名称提供属性:

[JsonProperty(PropertyName = "Feedback_IM&SR")]
string _feedback_imsr { get; set; }

现在您可以保留 JSON 数据的任何名称,并让您的 C# 类为该属性指定另一个名称。作为课程的一部分,它看起来像:

public class UserDetails
{
    int? _userId;
    string _emailId;
    string _userName;
    int _timezoneMins;
    string _customLogo;
    string _isExecutive;
    int _hasNTID;
    int? _org_Id;
    string _org_Name;
    string _designation;
    int? _location;
    string _location_Name;
    string _wsVersion;
    string _callMe;
    string _gPS;
    string _feedback_IMSR;
    string _rPT_Widgets_Access;
    [JsonProperty(PropertyName = "Feedback_IM&SR")]
    public string Feedback_IMSR
    {
       get{return _feedback_IMSR;}
       set{_feedback_IMSR = value;}
    }
}

【讨论】:

  • 你的回答很好,但我也想知道如果我错过了 json 中任何键的属性,反序列化会抛出任何错误吗?
  • 例如我没有为 gps 写任何属性,它会抛出任何错误或异常
  • @govardhan 有趣的问题!我从来没有尝试过,也许通过注释掉你的 C# 类中的一个属性来测试它,我现在无法访问 IDE :( 我想知道!
【解决方案2】:

您可以随意使用所有属性,但在 C# 实现中这样写:

class UserDetails
{
   [JsonProperty ("Feedback_IM&SR")]
    public string FeedbackProperty{ get; set; }
}

如果你在属性上方的“JsonProperty”属性,序列化器会知道在 JSON 中,属性的名称是属性中声明的名称

【讨论】:

  • 我自己写的,非常感谢,为什么编译不出来?这是一个真正的问题,我的回答也完全没问题,
  • 好吧,这很好,这就是您的答案被否决的原因。 不是我!
  • 那你会赞成它吗?就白白丢了2分!我觉得要求说实话很蹩脚,但你的指责让我失望了。没关系,我们都会犯错。
  • 对不起,如果我很苛刻,我投了赞成票,你的回答很好。
【解决方案3】:

您可以使用以下参考从 json 创建类对象

http://json2csharp.com/

只需粘贴您的 json 字符串,它就会在该 json 中生成 C# 类和属性。

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多