Как разобрать Json диктофон в swift 4 - PullRequest
0 голосов
/ 28 февраля 2020

Привет, у меня проблема с этим Json:

{
    "id": "libMovies",
    "jsonrpc": "2.0",
    "result": {
        "limits": {
            "end": 75,
            "start": 0,
            "total": 1228
        },
        "movies": [{
            "art": {
                "fanart": "myfanart",
                "poster": "myposter"
            },
            "file": "myfile",
            "label": "mylable",
            "movieid": mymovieid,
            "playcount": 0,
            "rating": myrating,
            "thumbnail": "mythumbnail"
        }]
    }
}

Когда я анализирую Json в swift 5 с этим кодом

try! JSONDecoder().decode([MyMovie].self, from: data!)

Я получаю эту ошибку

Неустранимая ошибка: 'попробуй!' В выражении неожиданно возникла ошибка: Swift.DecodingError.typeMismatch (Swift.Array, Swift.DecodingError.Context (codingPath: [], debugDescription: «Ожидается декодирование массива, но вместо этого найден словарь.», underError: nil)):

Как я могу решить это?

1 Ответ

0 голосов
/ 28 февраля 2020

Для следующих JSON,

{"id":"libMovies","jsonrpc":"2.0","result":{"limits":{"end":75,"start":0,"total":1228},"movies":[{"art":{"fanart":"myfanart","poster":"myposter"},"file":"myfile","label":"mylable","movieid":"mymovieid","playcount":0,"rating":"myrating","thumbnail":"mythumbnail"}]}}

Codable моделей, которые вам нужно использовать,

struct Root: Decodable {
    let id, jsonrpc: String
    let result: Result
}
struct Result: Decodable {
    let limits: Limits
    let movies: [Movie]
}

struct Limits: Decodable {
    let end, start, total: Int
}

struct Movie: Decodable {
    let art: Art
    let file, label, movieid: String
    let playcount: Int
    let rating, thumbnail: String
}
struct Art: Decodable {
    let fanart, poster: String
}

Анализ JSON data примерно так,

do {
    let response = try JSONDecoder().decode(Root.self, from: data)
    print(response.result.movies.map({"file: \($0.file), label: \($0.label)"}))
} catch {
    print(error)
}

Редактировать:

Чтобы сохранить фильмы отдельно, создайте переменную типа [Movie],

var movies = [Movie]()

Теперь при разборе сохраните response.result.movies в созданном выше свойстве,

do {
    let response = try JSONDecoder().decode(Root.self, from: data)
    print(response.result.movies.map({"file: \($0.file), label: \($0.label)"}))
    movies = response.result.movies
} catch {
    print(error)
}
...