序列化JSON解析时出错 - 解码

时间:2017-11-23 06:26:46

标签: ios json swift

我在使用swift 4解码和解析此JSON文件数据时遇到问题。我不知道如何在代码的底部构造我的结构,以便它们可以遍历我的数组字典数据。即。数据[0],数据[1],数据[2]等。 这是我遇到的错误:

序列化JSON keyNotFound时出错(whatsong.RecentTvList。(_882383248D6F034EC588461F3FFE705E中的CodingKeys).title,Swift.DecodingError.Context(codingPath:[],debugDescription:"没有与键标题关联的值(\&# 34; title \")。",underlyingError:nil))

{
data: [
    {
    _id: 100284,
    poster: "urlstring",
    title: "Happy!"
    },
    {
    _id: 100284,
    poster: "urlstring",
    title: "Happy!"
    }
    ]
}

let jsonUrlString = "HIDDEN"
    guard let url = URL(string: jsonUrlString) else
    {return}

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data else {return}

        do {

            let show =  try
                JSONDecoder().decode(RecentTvList.self, from: data)
            print(show)

        } catch let jsonErr {
            print("Error serializing JSON", jsonErr)
        }

        }.resume()

struct RecentTvListData: Decodable  {
    var data: [RecentTvList]
}

struct RecentTvList: Decodable  {
    var title: String?
    var poster: String?
}

3 个答案:

答案 0 :(得分:2)

我在你的回复中看到的问题是

data: []

实际上你得到这个词典回复

    {
    _id: 100284,
    poster: "urlstring",
    title: "Happy!"
    }

in to Array

并且您正在直接尝试传递包含Data字典数组的响应RecentTvList,其仅接受Dictionary这就是为什么它无法识别关键title 1}}作为错误建议

修改

尝试替换

let show =  try
            JSONDecoder().decode(RecentTvList.self, from: data)

let show =  try
            JSONDecoder().decode(RecentTvListData.self, from: data)

希望有助于解决您的问题

答案 1 :(得分:1)

    struct RecentTvList: Decodable  {
        var title: String
        var poster: String
        var _id : Int

    }
    struct RecentTvListData: Decodable  {
        var data: [RecentTvList]
    }
   let str =   """
{
    "data": [
        {
            "_id": 100284,
            "poster": "urlstring",
            "title": "Happy!"
        },
        {
            "_id": 100284,
            "poster": "urlstring",
            "title": "Happy!"
        }
    ]
}
"""
        do {
            let show =  try
                JSONDecoder().decode(RecentTvListData.self, from: str.data(using: .utf8)!)

            for tv in show.data  {
                print(tv._id)
            }
        } catch  {
            print(error)
        }

答案 2 :(得分:0)

查看您提供的JSON。响应中没有变量名poster_url。该值应该只是poster。 另外,您省略了-id变量。

我认为您的JSON结构应该是:

struct RecentTvListData: Decodable  {
var data: [RecentTvList]

}

struct RecentTvList: Decodable  {
var _id : Int
var poster : String
var title : String

}