Класс JsonConvert, который является наследованием со списком - PullRequest
0 голосов

Я использую приведенный ниже код для заполнения списка

 public class Group : List<Body>
    {
        public string Title { get; set; }
        public Group(string title)
        {
            Title = title;
        }
    }
    public class Body
    {
       public string Name { get; set; }
    }

 private void Button_Clicked(object sender, EventArgs e)
    {
        var items = new List<Group> {
            new Group("Title")
            {
                new Body { Name = "Dimitris" } }
        };
        var jsonstring = JsonConvert.SerializeObject(items);

    }

Мой результат

 [[{"Name":"Dimitris"}]]

Он не получает свойство title. Есть ли способ, которым я могу это исправить?

1 Ответ

1 голос
/ 30 апреля 2020

К сожалению, не каждый объект может быть сериализован в действительный json. И, как я сказал в комментариях, то, что вы хотите (то, что имеет как свойство заголовка, но и список), не может быть представлено в действительном json (в json что-то может иметь свойства {} или что-то может быть списком [], но не оба), есть больше структур, которые не могут быть представлены в действительных json (например, круговые зависимости), но, к сожалению, это одна из них.

Теперь я понимаю необходимость наследования List<Group> для ListView, так что это создает проблему. Однако это не проблема, которую нельзя обойти.

Вам необходимо отделить json от моделей, которые вы привязываете к своим представлениям (это, в общем, хорошая практика, imo). Таким образом, вы создаете объект, который несет данные и может быть сериализован в допустимое значение json:

public class BodyGroupDto
{
    public string Title;
    public List<Body> Items;
}

Теперь это может быть представлено следующим json:

[{
    "Title": "SomeTitle",
    "Items": [{
        "Name": "Dimitris"
    }]
}]

Теперь что у нас есть возможность отправлять данные с json, нам все еще нужно иметь возможность преобразовать наш объект данных в фактический Group объект, который мы хотим использовать в представлении.

Один из способов сделать это это добавить еще один конструктор в класс Group, чтобы мы могли передать ему и заголовок, и элементы:

public class Group : List<Body>
{
    public string Title { get; set; }
    public Group(string title)
    {
        Title = title;
    }

    public Group(string title, IEnumerable<Body> items) : base(items)
    {
        Title = title;
    }
}

И теперь мы можем преобразовать это внутри приложения Xamarin Forms, например, которое может выглядеть следующим образом :

public List<Group> GetGroups(string json)
{
    var bodyGroupList = JsonConvert.DeserializeObject<List<BodyGroupDto>>(json);

    return bodyGroupList.Select(bodyGroup => new Group(bodyGroup.Title, bodyGroup.Items)).ToList();
}

И если вам когда-нибудь понадобится конвертировать наоборот, вы можете сделать что-то вроде этого:

public string GetBodyGroupDtoListJson(List<Group> groups)
{
    var bodyGroupList = groups.Select(group => new BodyGroupDto
    {
        Title = group.Title,
        Items = group.ToList()
    }).ToList();

    return JsonConvert.SerializeObject(bodyGroupList);
}

Надеюсь, что это поможет и удачи в вашем проекте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...