使用字典动态序列化 Json 具有属性的对象

Serialize Json object with properties dinamycally with dictionary

我需要用字典动态地序列化一个对象的响应 留下了 json 个例子 我正在尝试在 c# class 中序列化此响应对象 (request_validator) 但这不起作用 有人可以帮助我,有什么想法吗?

{
    "person": {
        "testing": "CC",
        "simple": "1234545",
        "errorNames": {
            "id": "655789",
            "error": "simple"
        },
        "errorColor": {
            "id": "2",
            "error": "error color"
        }
    }
}

{
    "request_validator": [
        {
            "person.errorNames": [
                "error names"
            ],
            "person.errorColor": [
                "error color"
            ]
        }
    ]
}

public class DeserializeResponse{
      
    public Dictionary<string, List<string>> request_validator { get; set; }

}

var error = JsonConvert.DeserializeObject<List<DeserializeResponse>>(content);
public class DeserializeResponse
{
    [JsonPropertyName("request_validator")]
    public RequestValidator[] RequestValidator { get; set; }
}

public class RequestValidator
{
    [JsonPropertyName("person.errorNames")]
    public string[] PersonErrorNames { get; set; }

    [JsonPropertyName("person.errorColor")]
    public string[] PersonErrorColor { get; set; }
}

...

var error = JsonSerializer.Deserialize<DeserializeResponse>(content);

您可以使用 Newtonsoft.Json 库将字符串数组中的所有属性获取到字典中

在这种情况下,您只需指向搜索到的级别

using Newtonsoft.Json.Linq;
...
            JObject validator = JObject.Parse(content);
            IJEnumerable<JToken> validatorTokens = validator.SelectTokens("request_validator")?.Values();
            Dictionary<string, List<string>> errors = new Dictionary<string, List<string>>();
            if (validatorTokens != null)
            {
                foreach (JProperty prop in validatorTokens.Values())
                {
                    if (!errors.ContainsKey(prop.Name))
                    {
                        errors.Add(prop.Name, new List<string>());
                    }
                    errors[prop.Name].Add(prop.Value?.ToString());
                }
            }