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

反序列化 JSON 数据

反序列化 JSON 数据

C#
侃侃无极 2022-11-21 21:30:27

我目前正在尝试解析一些 JSON 数据。这是我得到的 JSON 字符串的格式:


{

  "messageFormat": "JSON",

  "messageArguments": [

    {

      "signUpModal": {

        "Id": 0,

        "FirstName": null,

        "LastName": null,

        "UserName": null,

        "Email": "<email address>",

        "RoleId": null,

        "Password": "<password>",

        "IsActive": null,

        "SecretKey": null,

        "Token": null,

        "Role": null,

        "RolePermissions": null,

        "ImagePath": null,

        "CurrentDate": null

      }

    }

  ]

}

我创建了两个类来匹配这个数据结构:


public class Parameter

{

    public string messageFormat { get; set; }

    public List<SignUpModal> messageArguments { get; set; }

}


public class SignUpModal

{

    public int? Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string UserName { get; set; }

    public string Email { get; set; }

    public int? RoleId { get; set; }

    public string Password { get; set; }

    public bool? IsActive { get; set; }

    public int? SecretKey { get; set; }

    public string Token { get; set; }

    public string Role { get; set; }

    public string RolePermissions { get; set; }

    public string ImagePath { get; set; }

    public string CurrentDate { get; set; }

}

现在,当我使用时var param = JsonConvert.DeserializeObject<Parameter>(tempData);没有错误,并且MessageFormat提交的文件正确显示“JSON”。该MessageArguments字段还包含该类的一个实例SignUpModal,但是该类中的所有字段SignUpModal都是null.


我试过以各种方式修改类结构,但数据甚至不会反序列化。我不确定为什么messageArguments没有正确提取该字段的数据。任何帮助/建议将不胜感激。


查看完整描述

4 回答

?
手掌心

TA贡献1669条经验 获得超3个赞

合同不匹配。您应该将 JSON 更改为:


{

    "messageFormat": "JSON",

    "messageArguments": [

    {

        "Id": 0,

        "FirstName": null,

        "LastName": null,

        "UserName": null,

        "Email": "<email address>",

        "RoleId": null,

        "Password": "<password>",

        "IsActive": null,

        "SecretKey": null,

        "Token": null,

        "Role": null,

        "RolePermissions": null,

        "ImagePath": null,

        "CurrentDate": null

    }]

}

或者改变实体


public class Parameter

{

    public string messageFormat { get; set; }

    public List<MessageArgument> messageArguments { get; set; }

}


class MessageArgument {

    public SignUpModal SignUpModal {get; set;}

}


public class SignUpModal

{

    public int? Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string UserName { get; set; }

    public string Email { get; set; }

    public int? RoleId { get; set; }

    public string Password { get; set; }

    public bool? IsActive { get; set; }

    public int? SecretKey { get; set; }

    public string Token { get; set; }

    public string Role { get; set; }

    public string RolePermissions { get; set; }

    public string ImagePath { get; set; }

    public string CurrentDate { get; set; }

}


查看完整回答
反对 回复 2022-11-21
?
忽然笑

TA贡献1528条经验 获得超5个赞

你错过了一节课。将此类添加到您的模型中:


public class MessageArgument

{

    public SignUpModal signUpModal { get; set; }

}

然后在类中更改这一行Parameter:


public List<SignUpModal> messageArguments { get; set; }

对此:


public List<MessageArgument> messageArguments { get; set; }


查看完整回答
反对 回复 2022-11-21
?
一只萌萌小番薯

TA贡献0条经验 获得超7个赞

看起来您使用了错误的类生成器。我已将您的 json 复制到jsonutils,它为我提供了这个模型:


public class SignUpModal

{

    public int Id { get; set; }

    public object FirstName { get; set; }

    public object LastName { get; set; }

    public object UserName { get; set; }

    public string Email { get; set; }

    public object RoleId { get; set; }

    public string Password { get; set; }

    public object IsActive { get; set; }

    public object SecretKey { get; set; }

    public object Token { get; set; }

    public object Role { get; set; }

    public object RolePermissions { get; set; }

    public object ImagePath { get; set; }

    public object CurrentDate { get; set; }

}


public class MessageArgument

{

    [JsonProperty("signUpModal")]

    public SignUpModal SignUpModal { get; set; }

}


public class Parameter

{

    [JsonProperty("messageFormat")]

    public string MessageFormat { get; set; }


    [JsonProperty("messageArguments")]

    public IList<MessageArgument> MessageArguments { get; set; }

}

请注意,此代码生成器允许您通过添加JsonProperty属性为属性设置 PascalCase


现在,如果您反序列化您的输入,您将看到非空Email和Password:


var input = "{\r\n  \"messageFormat\": \"JSON\",\r\n  \"messageArguments\": [\r\n    {\r\n      \"signUpModal\": {\r\n        \"Id\": 0,\r\n        \"FirstName\": null,\r\n        \"LastName\": null,\r\n        \"UserName\": null,\r\n        \"Email\": \"<email address>\",\r\n        \"RoleId\": null,\r\n        \"Password\": \"<password>\",\r\n        \"IsActive\": null,\r\n        \"SecretKey\": null,\r\n        \"Token\": null,\r\n        \"Role\": null,\r\n        \"RolePermissions\": null,\r\n        \"ImagePath\": null,\r\n        \"CurrentDate\": null\r\n      }\r\n    }\r\n  ]\r\n}";

var result = JsonConvert.DeserializeObject<Parameter>(input);


Console.WriteLine(result.MessageArguments.First().SignUpModal.Email); // will print "<email address>"



查看完整回答
反对 回复 2022-11-21
?
翻翻过去那场雪

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

正如 Matt Burland 指出的那样,问题在于messageArguments. 如果您还使用 Robert Harvey 提供的资源,您还会发现所创建的对象结构有所不同。


Parameter应该由


public string messageFormat { get; set; }

public List<MessageArgument> messageArguments { get; set; }

你还需要一个


{

    public SignUpModal signUpModal { get; set; }

}


查看完整回答
反对 回复 2022-11-21
  • 4 回答
  • 0 关注
  • 11 浏览

添加回答

举报

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