我目前正在尝试解析一些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
字段的数据。任何帮助/建议将不胜感激。
你错过了一堂课。将此类添加到模型中:
public class MessageArgument
{
public SignUpModal signUpModal { get; set; }
}
然后在Parameter
类中更改此行:
public List<SignUpModal> messageArguments { get; set; }
对此:
public List<MessageArgument> messageArguments { get; set; }
合同不匹配。您应该将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; }
}
正如Matt Burland指出的那样,问题在于messageArguments
。如果您还使用Robert Harvey提供的资源,您还会看到您创建的对象结构的差异。
Parameter
应该由
public string messageFormat { get; set; }
public List<MessageArgument> messageArguments { get; set; }
你还需要一个
{
public SignUpModal signUpModal { get; set; }
}
看起来你正在使用错误的类生成器。我把你的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 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>"