【问题标题】:Try to parse JSON Array of Arrays on Swift尝试在 Swift 上解析 JSON 数组
【发布时间】:2020-11-03 19:08:27
【问题描述】:

这里是json代码:

{
  
    "rows":
        [[{
            "text":"some text",
            "type":{
                "type":"inlineUrl",
                "url":"https://nothing.com"
            }
        }],
        [{
            "text":"some text",
            "type":{
                "type":"inlineCallback",
                "data":"some data"
            }
        },
        {
            "text":"some text",
            "type":{
                "type":"inlineCallback",
                "data":"some data"
            }
        }
        ]]
        
}

更缩写的形式如下: 行 = [ [Row1], [Row2, Row3] ]

我正试图让它像这样工作:

struct ReplyHandler: Codable {
    let rows: [RowsHandler]

    enum CodingKeys: String, CodingKey {
        case rows
    }
}

struct RowsHandler: Codable {
    let row1: [RowHandler]
    let row2: [Row2Handler]
    
    enum CodingKeys: String, CodingKey {
        case row1
        case row2
    }
}

struct RowHandler: Codable {
    let text: String
    let type: TypeHandler
    
    enum CodingKeys: String, CodingKey {
        case type = "type"
        case text = "text"
    }
}

struct Row2Handler: Codable {
    let row1: RowHandler
    let row2: RowHandler

    enum CodingKeys: String, CodingKey {
        case row1
        case row2
    }
}

struct TypeHandler: Codable {
    let type: String
    let url: String

    enum CodingKeys: String, CodingKey {
        case type = "type"
        case url = "url"
    }
    
}

但是 Xcode 编译器给出了这个错误:

本应解码字符串,但找到了一个数组。

不明白如何在数组中正确嵌套其他数组

在发布我的问题时,我注意到“类型”中的数组不同:第一行有 url,第二行和第三行有数据,但无论如何,这不是重点。

【问题讨论】:

  • 足够的信息?不,例如您有什么问题?什么问题?结构无法工作,例如 JSON 中的键 row1 在哪里?
  • 您没有提出问题或以明确的方式描述您的问题是什么,请一起删除最后一段
  • 对不起,我的第一次发帖。没有完全弄清楚如何客观地提出问题。

标签: arrays json swift codable


【解决方案1】:

你可以把你的模型简化成这样:

struct ReplyHandler: Codable {
    let rows: [[RowHandler]]
}

struct RowHandler: Codable {
    let text: String
    let type: TypeHandler
}

struct TypeHandler: Codable {
    let type: String
    var url: String?
    var data: String?
}

注意TypeHandler 中的urldata 属性是涵盖这两种情况的可选属性。

【讨论】:

  • 非常感谢 :) 它确实短得多,但主要是它可以工作
  • 不太明白...请您解释一下,这个模型如何以及为什么将 [[ ]](双引号数组)分成两个不同的数组 [ [ 1 ], [ 2, 3 ] ],它应该可以正常工作吗?我们没有明确划分它们。
  • @DobrySiabar rows 键是RowHandler[[RowHandler]] 甚至更好的Array<Array<RowHandler>>)数组的类型数组一个数组可以包含可变数量的元素。在您的示例 ([ [ 1 ], [ 2, 3 ] ]) 中,外部数组包含 2 个元素。它的第一个元素是一个仅包含一个元素的数组,而第二个元素是一个包含 2 个元素的数组。
  • @DobrySiabar 你可以在官方 swift 文档中找到关于Collection Types 的更好解释和示例。
【解决方案2】:

虽然手动 JSON 解析很有用,但我认为使用 https://app.quicktype.io/ 这样的工具将 JSON 转换为 Swift 类或结构一定要容易得多

为你 JSON 它提供了这个结果

// MARK: - Welcome
struct Welcome: Codable {
    let rows: [[Row]]
}

// MARK: - Row
struct Row: Codable {
    let text: String
    let type: TypeClass
}

// MARK: - TypeClass
struct TypeClass: Codable {
    let type: String
    let url: String?
    let data: String?
}

【讨论】:

  • 谢谢。用更大的 JSON 代码尝试了这个工具,有很多错误。没想到要剪掉那里的代码:(
猜你喜欢
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多