组合和嵌套 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】:

您可以在BooksWrapperbooks 属性到达您的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 对象的主要内容,如果未能解决你的问题,请参考以下文章

基于嵌套数组重新组合对象数组

获取嵌套字典与列表的组合数

将嵌套循环查询组合到父数组结果 - pg-promise

组合查询--表单对象转化为json对象

设计模式 组合模式

如何组合具有相同名称的 JSON 对象?