如何在swift 4中解析Json命令

如何在swift 4中解析Json命令,json,swift,json-rpc,jsondecoder,Json,Swift,Json Rpc,Jsondecoder,嗨,我对这个Json有问题: { "id": "libMovies", "jsonrpc": "2.0", "result": { "limits": { "end": 75, "start": 0, "total": 1228 }, "movies": [{ "art": { "fanart":

嗨,我对这个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"
        }]
    }
}
当我用下面的代码解析swift 5中的Json时

try! JSONDecoder().decode([MyMovie].self, from: data!)
我得到这个错误

致命错误:“尝试!”表达式意外引发错误:Swift.DecodingError.typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[],debugDescription:“应解码数组,但找到了字典。”,underlineError:nil)):

我怎样才能解决这个问题

对于下面的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
数据

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)
}

请阅读错误消息和JSON。它以
{
开头,因此它不能是数组。请注意,必须始终从顶部解码JSON,不能忽略根对象。如何做到这一点?如何仅打印“文件”、“标签”值?使用
打印(response.result.movies.map({”文件:\($0.file),标签:\($0.label)})
。更新了答案。是的,但现在我想将response.result.movies放入“listMovie”中。我尝试了listMovie:[result]->listMovie.append[response.result]但不起作用。我只得到第一个值,因为您需要列出类型
Movie
和append
response.result.movies
我得到了这个错误“无法将“[Movie]”类型的值转换为预期的参数类型“Movie”