首页 > 解决方案 > 访问对象内的对象列表

问题描述

我有ResponseModel一个名为的类,并且该类中的一个对象Errors引用该类ErrorsResponseModel,并且该类具有一堆具有List<string>数据类型的对象。我想知道如何在List<string>不经过类似的情况下访问对象:VariableClassA.ObjectOfClassAWhichReferToTheClassB.FirstListOfString并且VariableClassA.ObjectOfClassAWhichReferToTheClassB.SecondListOfStringList<string>对象的数据来自 JSON 数据。

我只尝试每个对象访问一个对象,因为我不确定如何在不通过每个对象一个对象的情况下进行泛型,也就是说,如果我更新 B 类本身的模型,那么我需要确保我没有错过对 B 类中新创建的对象进行必要的检查。

这是模型的代码:

public sealed class ResponseModel
{
    public ErrorsResponseModel Errors { get; set; }
}

public sealed class ErrorsResponseModel
{
    public List<string> Username { get; set; }
    public List<string> Password { get; set; }
    public List<string> Nickname { get; set; }
}

这是我到目前为止所尝试的:

string jsonData = "{"Errors":{"Username":["The username field is required."],"Password":["The password field is required."],"Nickname":["The nickname field is required."]}}";

var jsonConvertedData = JsonConvert.DeserializeObject<ResponseModel>(jsonData);

var usernameErrors = jsonConvertedData.Errors.Username;

var passwordErrors = jsonConvertedData.Errors.Password;

var nicknameErrors = jsonConvertedData.Errors.Nickname;

我希望循环该类内部ErrorsResponseModel长度List<string>大于 0 的任何类对象。我无法更改来自 JSON 的响应数据,因为它来自第三方。

编辑:我在 JavaScript 中尝试了以下内容并且它有效,我如何在 C# 中做同样的事情?

在 C# 中,我像使用以下内容一样返回到前端return Json(jsonConvertedData),而在前端,我确实喜欢以下内容:

$.ajax({
..... the AJAX settings

success: function (data) {
$.each(data.Errors, function (i, v) {
  if (v.length > 0) {
       console.log(v);
    }
});
}

上面的 Javascript 代码循环遍历每个对象内部的消息ErrorsResponseModel并将其读取到控制台。

标签: c#json

解决方案


ErrorsResponseModel继承Dictionary

public sealed class ErrorsResponseModel : Dictionary<string, List<string>>
{
    //If you still want to access data with property.
    public List<string> Username => this["Username"];
    ...
}

Errors现在你可以像普通字典一样循环

foreach (var item in jsonConvertedData.Errors)
    if(item.Value.Count > 0)
       Console.WriteLine($"{item.Key} => {item.Value[0]}");

dynamic是另一种选择

var jsonConvertedData = JsonConvert.DeserializeObject<dynamic>(jsonData);

foreach (var item in jsonConvertedData.Errors)
    if(item.Count > 0)
        foreach(var v in item.Value)
            Console.WriteLine(v);

推荐阅读