访问对象内部的对象列表

时间:2019-09-26 02:33:38

标签: c# json

我有一个名为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内的每个对象内遍历消息,并将其读到控制台。

2 个答案:

答案 0 :(得分:1)

override fun onDraw(canvas: Canvas) { super.onDraw(canvas) cv=canvas draw_beautiful_async(canvas) invalidate() } fun draw_beautiful_async(canvas: Canvas) { MyDrawingWorkerTask().execute() } 继承class MyDrawingWorkerTask() : AsyncTask<Canvas, Void, Void>() { override fun doInBackground(vararg canvases: Canvas): Void? { vt = 0; var x1 = 0f; var y1 = 0f; var style = 0 for (i in 1..cloud_number) { vt = i * 4 - 3 style = mt_cloud[vt] x1 = mt_cloud[vt + 2].toFloat() y1 = mt_cloud[vt + 3].toFloat() cv.drawBitmap(canvas_cloud1, x1, y1, mPaint) } return null }

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]}");

答案 1 :(得分:0)

一种方法是创建一个类来保存相关数据,例如:

class User
{
    public string Name { get; set; }
    public string Nickname { get; set; }
    public string Password { get; set; }
}

然后,我们可以创建一个方法来填充ErrorsResponseModel类中的此类列表(在首先确认所有列表的计数都相同之后):

public List<User> GetUsers(ErrorsResponseModel errors)
{
    if (errors == null || errors.Username == null) return null;
    if (errors.Username.Count == 0) return new List<User>();

    if (errors.Nickname?.Count != errors.Password?.Count ||
        errors.Password?.Count != errors.Username.Count)
    {
        throw new InvalidDataException("Unequal number of Usernames/Passwords/Nicknames");
    }

    return errors.Username
        .Select((userName, index) =>
        new User
        {
            Name = userName,
            Nickname = errors.Nickname[index],
            Password = errors.Password[index]
        }).ToList();
}