将JSON反序列化为C#对象

时间:2019-04-09 06:59:58

标签: c# json deserialization

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

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

这是我使用的c#类

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

公共类User_     {         公用字符串电子邮件{get;组; }         公共字符串密码{get;组; }     }

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

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

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

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

在调试时,我看到了

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

看起来很奇怪

6 个答案:

答案 0 :(得分:2)

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

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

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

OR

反序列化以下JSON:

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

答案 1 :(得分: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上运行

答案 2 :(得分:0)

我相信您的c#类中有2个问题

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

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

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

这将解决您的问题。

答案 3 :(得分:0)

您可以尝试使用此代码吗?

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

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

[JsonProperty("KeyName")] 为您提供反序列化包含某些密钥的json之类的优点,例如

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

还有更多

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

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

输出:

enter image description here