Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#-使用索引数组反序列化JSON_C#_Json_Serialization - Fatal编程技术网

c#-使用索引数组反序列化JSON

c#-使用索引数组反序列化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

作为回应,我得到了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 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的方式完全相同,其中重要信息位于属性名中,而不是位于值中。或者当你有一个动态属性名时。这不是一个解决方案,因为它可以是用户计数动态变化