c# - 访问对象内的对象列表
问题描述
我有ResponseModel
一个名为的类,并且该类中的一个对象Errors
引用该类ErrorsResponseModel
,并且该类具有一堆具有List<string>
数据类型的对象。我想知道如何在List<string>
不经过类似的情况下访问对象:VariableClassA.ObjectOfClassAWhichReferToTheClassB.FirstListOfString
并且VariableClassA.ObjectOfClassAWhichReferToTheClassB.SecondListOfString
,List<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
并将其读取到控制台。
解决方案
让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);
推荐阅读
- laravel - Vue 路由器历史模式结合 laravel catch all 重定向 404 标头提供 200 标头状态码
- angular - 角度类替换绑定解释
- c# - Xamarin - AutoMapper 在初始化后添加配置文件
- javascript - 即使在 beforeEach 钩子中的值发生变化后,原始值也用于动态测试
- c# - 文本框中的逗号
- python - 如何使用 python 从 JSON 输出中获取匹配的结果?
- javascript - 画布从左下角到右上角一直变黑
- c - 为什么全宽移位对于常量和变量的行为不同?
- html - 一个 HTML 页面没有看到 CSS(Chrome 除外),但在不同的页面上却看到了
- activemq-artemis - 无法运行消息队列