Xamarin Refit - Newtonsoft.Json.JsonSerializationException - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть некоторые проблемы с сериализацией JSON.Когда я пытаюсь десериализовать мой объект JSON, он возвращает мне эту ошибку:

Newtonsoft.Json.JsonSerializationException: Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип 'Project.Models.BookModel ', поскольку для корректной десериализации типу требуется объект JSON (например, {"name": "value"}).

Моя проблема заключается в том, что мне нужно десериализовать мой объект в двухразличные способы: в массиве JSON (например, [1,2,3]) извлечь «_id», «user» и «name», а затем в массиве JSON (например, [«name»: «value»]) дляизвлечь "книги".И я не знаю, как это сделать.Точнее, я не знаю, возможно ли это с помощью Refit.

Вот мой JSON:

[
{
    "_id": "5c014a1e43b6804ed7b642b2",
    "__v": 0,
    "user": "5c014a1d43b6804ed7b642b1",
    "name": "Favoris",
    "books": [
        {
            "_id": "5a8f12e16a16fa06d1f5b0cb",
            "title": "Harry Potter et la Chambre des Secrets",
            "author": {
                "_id": "5a8f12e16a16fa06d1f5b0bd",
                "name": "J K Rowling",
                "__v": 0
            },
            "literaryGenre": "Juvenile Fiction",
            "isbn": 9781781101049,
            "externalImage": "...",
            "__v": 0,
            "content": {
                "brief": "test1"
            }
        },
        {
            "_id": "5a8f12e16a16fa06d1f5b0d0",
            "title": "Harry Potter et la Coupe de Feu",
            "author": {
                "_id": "5a8f12e16a16fa06d1f5b0bd",
                "name": "J K Rowling",
                "__v": 0
            },
            "literaryGenre": "Juvenile Fiction",
            "isbn": 9781781101063,
            "externalImage": "...",
            "__v": 0,
            "content": {
                "brief": "test2"
            }
        }
    ]
}
]

Вот мой код:

public async void ViewLibrary()
    {
        IProjectApi response = ProjectRepository.Instance.ProjectApi;
        List<LibraryModel> library = await response.GetLibrary("5c014a1d43b6804ed7b642b1");

        this.LibraryItems = library;
    }

Имой объект LibraryModel:

public class LibraryModel
{
    public string _id { get; set; }

    public string user { get; set; }

    public string name { get; set; }

    public BookModel books { get; set; }
}

и мой метод GetLibrary:

    [Get("/api/library/user/{UserId}")]
Task<List<LibraryModel>> GetLibrary(string UserId);

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип 'Project.Models.BookModel', поскольку для типа требуется объект JSON (например, {"name": "value"})

В json приведите ваш BookModel, возвращающий несколько записей, поэтому его следует определить как List<BookModel>.

В LibraryModel попробуйте использовать public List<BookModel> books { get; set; }.

0 голосов
/ 06 декабря 2018

Реализуйте эти классы в любом месте вашего кода и попытайтесь десериализовать ваш json с помощью этих классов.

public class Author
{
    public string _id { get; set; }
    public string name { get; set; }
    public int __v { get; set; }
}

public class Content
{
    public string brief { get; set; }
}

public class Book
{
    public string _id { get; set; }
    public string title { get; set; }
    public Author author { get; set; }
    public string literaryGenre { get; set; }
    public object isbn { get; set; }
    public string externalImage { get; set; }
    public int __v { get; set; }
    public Content content { get; set; }
}

public class RootObject
{
    public string _id { get; set; }
    public int __v { get; set; }
    public string user { get; set; }
    public string name { get; set; }
    public List<Book> books { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...