首页 > 解决方案 > 通过 Codable 协议解析 JSON

问题描述

我以这种形式向 Firebase 提供了答案:

    ["allNews": <__NSArrayM 0x6000015f06c0>(
{
    createDate = "21.02.19";
    creator = "lol@gmail.com";
    creatorImageURL = "<null>";
    creatorUID = kzorlyIOI3RgEjCV1XDLQUhu5CS2;
    newsImageURL = "";
    text = "Daft g s dfg ";
    title = "Test ";
},
{
    createDate = "21.02.19";
    creator = "plol2@gmail.com";
    creatorImageURL = "<null>";
    creatorUID = Tw1JzFzcVbelRUA7GoFZ9CIWIwr1;
    newsImageURL = "";
    text = Vcbccvbvb;
    title = hdbdvbccfb;
}
)
]

如何通过 Codable 协议解析它?

下面是我的代码:

struct AllNews: Codable {
    var allNews: [DetailNews]
}

struct DetailNews: Codable {
    var creator: String
    var creatorUID: String
    var title: String
    var text: String
    var createDate: String
    var creatorImageURL: String
    var newsImageURL: String
}

这就是我解析数据的方式

guard let newsData = try? JSONSerialization.data(withJSONObject: document.data(), options: []) else { return }
let decodeJSON = JSONDecoder()

let allNews = try? decodeJSON.decode([DetailNews].self, from: newsData)
print(allNews)

但是 allNews 仍然为零,尽管新闻数据以 json 的形式提供给我,附在上面

标签: iosjsonswiftcodable

解决方案


您收到以下格式的回复:

[ "allNews": (
    {
        key : value
    },
    {
        key : value
    }
)]

由于您的新闻数组位于 allNews 键中,因此您应该通过AllNewsstruct 将您的响应解码为:

guard let newsData = try? JSONSerialization.data(withJSONObject: document.data(), options: []) else { return }
let allNews = try? JSONDecoder().decode(AllNews.self, from: newsData)
print(allNews)

推荐阅读