反序列化JSON数据

问题描述 投票:1回答:4

我目前正在尝试解析一些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字段的数据。任何帮助/建议将不胜感激。

c# json json.net
4个回答
0
投票

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

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

然后在Parameter类中更改此行:

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

对此:

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

0
投票

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

0
投票

正如Matt Burland指出的那样,问题在于messageArguments。如果您还使用Robert Harvey提供的资源,您还会看到您创建的对象结构的差异。

Parameter应该由

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

你还需要一个

{
    public SignUpModal signUpModal { get; set; }
}

0
投票

看起来你正在使用错误的类生成器。我把你的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

现在,如果您反序列化您的输入,您将看到非null EmailPassword

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>"
© www.soinside.com 2019 - 2024. All rights reserved.