【问题标题】:Deserialize JSON into C# Object将 JSON 反序列化为 C# 对象
【发布时间】:2019-04-09 06:59:58
【问题描述】:

我正在尝试将 json 对象反序列化为 c# 对象,但无法做到。这是我发送的 json 对象

{
    "User_":
    {
        "Email":"test@test.com",
        "Password":"pass1"
    }
}

这是我使用的 c# 类

public class User_
{
    public string Email { get; set; }
    public string Password { get; set; }
}

公共类用户_ { 公共字符串电子邮件{获取;放; } 公共字符串密码{获取;放; } }

public class RootObject
{
    public User_ User_ { get; set; }
}

这是我用来反序列化的代码

RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());

此代码创建一个 User_ 对象,但电子邮件和密码字段为空。我在这里做错了什么?

在调试的时候,我看到了即将发生的事情

{{ "{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}": ""  }}

看起来很奇怪

【问题讨论】:

  • 你应该反序列化为RootObject。而且您需要更改属性的名称以匹配 json 中的名称(或相反)并且类 User_ 可能应该是 User
  • 例如,您将问题编辑为反序列化为 RootObject 而不是 User_这是否解决了您的问题? 如果是,那么很可能这是不正确的做法,因为如果这解决了您的问题,您可能应该删除该问题,因为它不再有意义。
  • 那么请将您的实际代码发布为您在问题does work中发布的代码。
  • 我喜欢 Json/C# 问题的模糊性,每个问题都带有新的“Json2CSharp”、“相同的代码相同的东西”。要么是骗子,要么是错字,要么是需要 MCVE。我们不需要这么多答案。
  • 您截图中的json与您问题中的json不匹配。

标签: c# json deserialization


【解决方案1】:

如果我这样做,我会得到正确的 EmailPassword 值:

public class User_
  {
    public string Email { get; set; }
    public string Password { get; set; }
  }

  public class RootObject
  {
    public User_ User_ { get; set; }
  }

  class Program
  {
    static void Main(string[] args)
    {
      string jsonString = "{\"User_\":{\"Email\":\"test@test.com\",\"Password\":\"pass1\"}}";
      RootObject request = JsonConvert.DeserializeObject<RootObject>(jsonString.ToString());
      Console.WriteLine("Email: {0}", request.User_.Email);
      Console.WriteLine("Password: {0}", request.User_.Password);
      Console.ReadLine();
    }
  }

你可以看到它在工作HERE

【讨论】:

  • 在调试时,我收到 {{ "{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}": "" }}
  • @ArifYILMAZ,所以json 的格式不正确。这就是它在您的程序中失败的原因。
【解决方案2】:

直接反序列化类的对象时,JSON中不需要类名。另一方面,如果您要反序列化上面给出的 JSON,则使用 RootObject 进行反序列化

var user = JsonConvert.DeserializeObject<RootObject>(json.ToString()).User_;

public class RootObject
{
    public User_ User_ { get; set; }
}

改为反序列化以下 JSON:

    {
        "Email":"test@test.com",
        "Password":"pass1"
    }

【讨论】:

    【解决方案3】:

    当您的键名不是纯字母时,为什么不使用 [JsonProperty("KeyName")]

    [JsonProperty("KeyName")] 为您提供反序列化此类包含一些键的 json 的优势,例如

    • 用户_
    • 用户$
    • @用户
    • *用户&

    还有更多

    只需将此属性添加到您的类属性中,例如

    [JsonProperty("User_")]
    public User User { get; set; }
    

    这使您的属性名称保持简单且更具可读性

    所以最后是你的 json

    {
        "User_":
        {
            "Email_":"test@test.com",
            "Password_":"pass1"
        }
    }
    

    添加JsonProperty后的所有类看起来像

    public class RootObject
    {
        [JsonProperty("User_")]
        public User User { get; set; }
    }
    
    public class User
    {
        [JsonProperty("Email_")]
        public string Email { get; set; }
    
        [JsonProperty("Password_")]
        public string Password { get; set; }
    }
    

    用法:

    RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
    
    Console.WriteLine(request.User.Email);
    Console.WriteLine(request.User.Password);
    

    输出:

    【讨论】:

      【解决方案4】:

      我相信你的 c# 课程有 2 个问题

      1. 在你的RootObject 类中你必须使用

        public User_ User{get;set;}
        
      2. 当您对 Json 进行序列化时,您必须使用。

        User_ request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
        

      这将解决您的问题。

      【讨论】:

        【解决方案5】:

        你能试试这个代码吗?

        public class User_
        {
            public string Email { get; set; }
            public string Password { get; set; }
        }
        
        public class RootObject
        {
            public User_ User { get; set; }
        }
        

        反序列化操作:

        RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
        

        【讨论】:

          【解决方案6】:

          主要问题是您的 RootObject 被序列化为新对象的属性名称,字符串为空作为值。对许多序列化服务器端的结果。

          您可以轻松处理这些问题,一旦密码/电子邮件更改,您将需要一个新的,以下课程仅适用于这个确切的 Json 响应。

          public partial class DontDoThis
          {
              [JsonProperty("{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}")]
              public string EmailTestTestComPasswordPass1 { get; set; }
          }
          

          为了解决这个问题,您需要:
          - 更改代码服务器端以提供正确的结果。
          - 字符串操作以删除和取消转义结果。
          - 反序列化一次并再次反序列化。

          【讨论】:

            猜你喜欢
            • 2015-08-05
            • 1970-01-01
            • 1970-01-01
            • 2016-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多