繁体   English   中英

将 JSON 反序列化为 C# 对象

[英]Deserialize JSON into C# Object

我正在尝试将 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 User_ { public string Email { get; 放; }公共字符串密码{获取; 放; } }

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

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

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

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

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

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

看起来很奇怪

直接反序列化一个类的对象时,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"
    }

如果我这样做,我会得到正确的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();
    }
  }

你可以看到它在这里工作

当您的键名不是纯字母时,为什么不使用[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);

输出:

在此处输入图片说明

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

  1. 在您的RootObject类中,您必须使用

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

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

这将解决您的问题。

你可以试试这个代码。

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());

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM