【问题标题】:Deserializing JSON data反序列化 JSON 数据
【发布时间】:2019-04-01 20:11:43
【问题描述】:

我目前正在尝试解析一些 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&lt;Parameter&gt;(tempData); 时,不会出现任何错误,并且 MessageFormat 归档正确显示“JSON”。 MessageArguments 字段还包含SignUpModal 类的一个实例,但是SignUpModal 类中的所有字段都是null。

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

【问题讨论】:

  • 您在数组messageArguments 中的对象不是SignUpModal,而是具有signUpModal 属性的对象,即SignUpModal
  • 将您的代码与生成的代码进行比较:json2csharp.com

标签: c# json json.net


【解决方案1】:

你缺课了。将此类添加到您的模型中:

public class MessageArgument
{
    public SignUpModal signUpModal { get; set; }
}

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

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

到这里:

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

【讨论】:

    【解决方案2】:

    合同不匹配。您应该将 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; }
    }
    

    【讨论】:

      【解决方案3】:

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

      Parameter 应该包含

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

      你还需要一个

      {
          public SignUpModal signUpModal { get; set; }
      }
      

      【讨论】:

        【解决方案4】:

        您似乎使用了错误的类生成器。我已将您的 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>"
        

        【讨论】:

          猜你喜欢
          • 2013-08-17
          • 1970-01-01
          • 2018-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-14
          • 2021-08-31
          相关资源
          最近更新 更多