c#-使用索引数组反序列化JSON
作为回应,我得到了JSONc#-使用索引数组反序列化JSON,c#,json,serialization,C#,Json,Serialization,作为回应,我得到了JSON { "message": "The request is invalid.", "modelState": { "users[0].FirstName": [ "First name is required", "First name should contains at least one letter" ], "users[1].FirstName": [ "First name is requi
{
"message": "The request is invalid.",
"modelState": {
"users[0].FirstName": [
"First name is required",
"First name should contains at least one letter"
],
"users[1].FirstName": [
"First name is required",
"First name should contains at least one letter"
]
}
}
如何使用索引反序列化?
我正在使用JsonConvert.DeserializeObject并希望为此响应创建POJO对象您需要映射类来反序列化JSON。对于棘手的键
users[0].FirstName
,它看起来像其他类的属性,您可以使用JsonProperty
属性
static void Main(string[] args)
{
string jsonStr = "{\"message\": \"The request is invalid.\", \"modelState\": { \"users[0].FirstName\": [\"First name is required\", \"First name should contains at least one letter\" ],\"users[1].FirstName\": [\"First name is required\", \"First name should contains at least one letter\" ]}}";
var obj = JsonConvert.DeserializeObject<Message>(jsonStr);
// Output
Console.WriteLine("message: " + obj.message);
Console.WriteLine("modelState:");
Console.WriteLine("users[0].FirstName: ");
foreach (var item in obj.modelState.Obj1)
Console.WriteLine(item);
Console.WriteLine("users[1].FirstName: ");
foreach (var item in obj.modelState.Obj2)
Console.WriteLine(item);
Console.Read();
}
class Message
{
public string message { get; set; }
public ModelState modelState { get; set; }
}
class ModelState
{
[JsonProperty("users[0].FirstName")]
public string[] Obj1 { get; set; }
[JsonProperty("users[1].FirstName")]
public string[] Obj2 { get; set; }
}
static void Main(字符串[]args)
{
字符串jsonStr=“{\”消息\“:\”请求无效。\”,\“modelState\”:{\”用户[0]。FirstName\“:[\”名字是必需的\“,\”名字应该至少包含一个字母\“],\”用户[1]。FirstName\“:[\”名字是必需的\“,\”名字应该至少包含一个字母\“]}”;
var obj=JsonConvert.DeserializeObject(jsonStr);
//输出
控制台写入线(“消息:+obj.message”);
Console.WriteLine(“modelState:”);
Console.WriteLine(“用户[0]。名字:”);
foreach(obj.modelState.Obj1中的变量项)
控制台写入线(项目);
Console.WriteLine(“用户[1]。名字:”);
foreach(obj.modelState.Obj2中的变量项)
控制台写入线(项目);
Console.Read();
}
类消息
{
公共字符串消息{get;set;}
公共模型状态模型状态{get;set;}
}
类模型状态
{
[JsonProperty(“用户[0].FirstName”)]
公共字符串[]Obj1{get;set;}
[JsonProperty(“用户[1].FirstName”)]
公共字符串[]Obj2{get;set;}
}
输出:
消息:请求无效。
模型状态:
用户[0]。名字:
名字是必需的
名字应至少包含一个字母
用户[1]。名字:
第一个名字是必需的
名字应该至少包含一个字母
我选择字典。它是有效的,但它可以让您使用字符串而不是POJO来完成此解决方案。但可以将字符串转换为POJO
public class UserErrorMessage
{
public string Message { get; set; }
public Dictionary<string, string[]> ModelState { get; set; }
}
公共类UserErrorMessage
{
公共字符串消息{get;set;}
公共字典模型状态{get;set;}
}
JSON是从哪里来的?据我所知,你不能直接这么做。您需要分步解析它。如果您控制了源代码,请解决此问题。将modelState解析为字符串、字符串,并在该字符串上循环以选择要避免此错误命名的属性名称的项。以及创建所需pojo类的实例。与处理json的方式完全相同,其中重要信息位于属性名中,而不是位于值中。或者当你有一个动态属性名时。这不是一个解决方案,因为它可以是用户计数动态变化