组合和嵌套 JSON 对象
Posted
技术标签:
【中文标题】组合和嵌套 JSON 对象【英文标题】:Combine and nested JSON objects 【发布时间】:2021-08-30 17:37:25 【问题描述】:我有以下型号:
struct Book: Codable, Identifiable
var id: Int
var title: String
var author: String
struct BookWrapper: Codable
var books: [Book]
和 JSON:
"books": [
"id": 1,
"title": "Nineteen Eighty-Four: A Novel",
"author": "George Orwell"
,
"id": 2,
"title": "Animal Farm",
"author": "George Orwell"
],
"errMsg": null
我正在尝试使用 Combine 来获取数据,但找不到绕过该书籍数组的方法。如果是 flat 数据,我将使用以下数据:
func fetchBooks()
URLSession.shared.dataTaskPublisher(for: url)
.map $0.data
.decode(type: [Book].self, decoder: JSONDecoder())
.replaceError(with: [])
.eraseToAnyPublisher()
.receive(on: DispatchQueue.main)
.assign(to: &$books)
我尝试使用 BookWrapper.self,但它没有任何意义。有什么优雅的方法可以解决吗?
【问题讨论】:
不相关但eraseToAnyPublisher()
在这种情况下毫无意义(无返回值)
【参考方案1】:
您可以在BooksWrapper
的books
属性到达您的assign
之前将其map
:
func fetchBooks()
URLSession.shared.dataTaskPublisher(for: url)
.map $0.data
.decode(type: BookWrapper.self, decoder: JSONDecoder())
.replaceError(with: BookWrapper(books: [])) //<-- Here
.map $0.books //<-- Here
.receive(on: DispatchQueue.main)
.assign(to: &$books)
【讨论】:
它确实有效,但我不知道那里发生了什么。你能给我指出任何可以解释你所做的事情的文档吗? 唯一重要的是添加了地图功能——你可以查看它的文档。如果使用 combine ,熟悉它是一件好事。它接受一个输入并将其转换为不同的输出。在这种情况下,输入是 BooksWrapper,输出只是 books 属性。以上是关于组合和嵌套 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章