gpt4 book ai didi

ios - 我正在尝试从 Swift subreddit 解析 JSON。为什么我有问题?

转载 作者:行者123 更新时间:2023-11-28 05:39:35 24 4
gpt4 key购买 nike

我想知道为什么在使用 Decodable 解析 JSON 时出现 keyNotFound。

我需要解析来自 https://www.reddit.com/r/swift/.json 的 JSON我需要用于描述的“selftext”字段以及图像的“url”。它们的嵌套方式不同。

到目前为止,这是我的 Reddit 模型:

import Foundation

struct Model : Decodable {
let data: ListingData
}

struct ListingData: Decodable {
let children: [Child]
}

struct Child: Decodable {
let data: ChildData
}

struct ChildData : Decodable {
let selftext: String
let preview: ImageURL
}

struct ImageURL: Decodable {
let url: URL
}

这是我的网络服务:

import Foundation

class NetworkingService {

static let shared = NetworkingService()
private init() {}

let session = URLSession.shared

func getReddits(success successBlock: @escaping (ChildData) -> Void) {
guard let url = URL(string: "https://www.reddit.com/r/swift/.json") else { return }
let request = URLRequest(url: url)

session.dataTask(with: request) { [weak self] data, _, error in
guard self != nil else { return }

if let error = error { print(error); return }
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase

let model = try decoder.decode(ChildData.self, from: data!)
successBlock(model)
} catch {
print(error)
}
}.resume()
}
}

我的带有 collectionView 的 HomeViewController 看起来像这样:

import UIKit

class HomeViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

@IBOutlet weak var collectionView: UICollectionView!

private var reddits: [ChildData] = []

override func viewDidLoad() {
super.viewDidLoad()
}

override func viewWillAppear(_ animated: Bool) {
collectionView.layer.cornerRadius = 0.5
let nib = UINib(nibName: "RedditsCollectionViewCell", bundle: nil)
self.collectionView.register(nib, forCellWithReuseIdentifier: "RedditsCollectionViewCell")

NetworkingService.shared.getReddits { [weak self] (response) in
self?.reddits = [response]
}
}

override func viewDidAppear(_ animated: Bool) {
}

//Number of views
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return reddits.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

if let redditCell = collectionView.dequeueReusableCell(withReuseIdentifier: "RedditCollectionViewCell", for: indexPath) as? RedditCollectionViewCell {

print("collection1 \(redditCell.isAnimated)")
redditCell.updateCell(with: reddits[indexPath.row])

return redditCell
} else {
return UICollectionViewCell()
}
}
}

extension UICollectionView {
func reloadData(_ completion: @escaping () -> Void) {
reloadData()
DispatchQueue.main.async { completion() }
}
}

最后,我的 Cell 看起来像这样:

import UIKit

class RedditCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var redditImage: UIImageView!
@IBOutlet weak var redditTitleLabel: UILabel!
@IBOutlet weak var shadowView: UIView!

@IBOutlet weak var viewCenterConstraint: NSLayoutConstraint!
@IBOutlet weak var labelCenterConstraint: NSLayoutConstraint!

func updateCell(with reddit: ChildData) {
}
}

extension UIImageView {

func loadImage(from url: URL) {
URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
if let error = error {
print(error)
}

guard let data = data else { return }

let image = UIImage(data: data)
DispatchQueue.main.async {
self?.image = image
}
}.resume()
}
}

谢谢!

最佳答案

首先,解码时需要从根结构Model开始

let model = try decoder.decode(Model.self, from: data!)

那么你的结构声明是错误的,因为 url 部分嵌套得更深,所以我需要添加一些结构,而且 preview 似乎并不总是存在,所以我将该属性设为可选

struct ChildData : Decodable {
let selftext: String
let preview: Images?
}

struct Images : Decodable {
let images: [Source]
}

struct Source : Decodable {
let source: ImageURL
}
struct ImageURL: Decodable {
let url: URL
}

我的简单打印验证代码

let model = try decoder.decode(Model.self, from: data!)
for child in model.data.children {
if let image = child.data.preview?.images.first {
print(image.source.url)
}
}

关于ios - 我正在尝试从 Swift subreddit 解析 JSON。为什么我有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57322457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com