为了账号安全,请及时绑定邮箱和手机立即绑定

将 JSON 反序列化为 C# 对象

将 JSON 反序列化为 C# 对象

C#
动漫人物 2022-12-04 11:07:27
我正在尝试将 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 和 Password 字段为空。我在这里做错了什么?在调试时,我看到了即将发生的事情{{ "{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}": ""  }}看起来很奇怪
查看完整描述

5 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

如果我这样做,我会得到 和 的正确Email值Password:


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

    }

  }

你可以看到它在这里工作


查看完整回答
反对 回复 2022-12-04
?
开满天机

TA贡献1786条经验 获得超13个赞

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

输出:

//img1.sycdn.imooc.com//638c0f1a0001dcee01170052.jpg

查看完整回答
反对 回复 2022-12-04
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

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

    }


查看完整回答
反对 回复 2022-12-04
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

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

  1. 在你的RootObject课上你必须使用

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

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

这将解决您的问题。


查看完整回答
反对 回复 2022-12-04
?
浮云间

TA贡献1829条经验 获得超4个赞

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


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


public partial class DontDoThis

{

    [JsonProperty("{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}")]

    public string EmailTestTestComPasswordPass1 { get; set; }

}

为了解决这个问题,您需要:

- 更改代码服务器端以提供正确的结果。

- 字符串操作以删除和取消转义结果。

-反序列化一次并再次反序列化。


查看完整回答
反对 回复 2022-12-04
  • 5 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信