【问题标题】:Parsing JSON with Argo on Swift在 Swift 上使用 Argo 解析 JSON
【发布时间】:2015-11-19 07:48:15
【问题描述】:

我正在尝试使用下一种格式解析 JSON 数据:

["1", "string", "", "0.16"]

这些“奇怪”的 json 应该以下一个方式映射到我的对象:

myObject.id = json[0] //"1"
myObject.name = json[1] //"string"
myObject.surname = json[2] // ""
myObject.length = json[3] // "0.16"

我正在使用 Argo 进行解析,有我的代码示例

public struct SomeObject {
     public var id: String
     public var name: String
     public var surname: String
     public var length: Float
}

extension SomeObject: Decodable {
    static func create(id: String)(name: String)(surname: String)(length: String) -> SomeObject {
         return SomeObject(id: id, name: name, surname: surname, length: length)
}

    public static func decode(json: JSON) -> Decoded<SomeObject> {
         return SomeObject.create <- actually don't know what to put here, i tried json[0], and decode(json[0]) and casting but still no luck
}

解析这种 JSON 数据的正确方法是什么?

【问题讨论】:

    标签: json swift parsing


    【解决方案1】:

    供您参考:

     let ar = ["1", "string", "", "0.16"]
    
    public struct SomeObject {
        public var id: String?
        public var name: String?
        public var surname: String?
        public var length: Float?
    }
    
    extension SomeObject {
        static func create(id: String?, name: String?, surname: String?, length: Float?) -> SomeObject {
            return SomeObject(id: id, name: name, surname: surname, length: length)
        }
    
        public static func decode(json: AnyObject?) -> SomeObject {
            let js = json as! Array<AnyObject>
            return SomeObject.create(js[0] as? String, name: js[1] as? String, surname: js[2] as? String, length: js[3] as? Float)
        }
    }
    
    let someObject = SomeObject.decode(ar)
    

    【讨论】:

    • 谢谢,但我正在尝试使用 Argo,所以我可以将它与我用销售库解析的其他实体集成
    • Argo 是一个网络框架,对吧?所以只有你能在答案中得到像ar 这样的数据就足够了。如果不清楚您的问题,那么。
    • Argo 是适用于 Swift 的功能性 JSON 解析库,您可以在这里找到更多信息 github.com/thoughtbot/Argo
    【解决方案2】:

    Argo 没有设置为从这样的数组中提取某些索引。您需要做的是首先将其解码为[String],然后选择您想要的索引。

    let values: Decoded<[String]> = decodeArray(json)
    return SomeObject.create
      <^> ({ $0[0] } <^> values)
      <*> ({ $0[1] } <^> values)
      <*> ({ $0[2] } <^> values)
      <*> (values >>- { .fromOptional(Float($0[3])) })
    

    您可以看到我使用闭包来拉出所需的索引。最后一个还将String 转换为Float 以匹配您的类型。

    除了这个解析代码之外,您还可以通过使用 let 而不是 var 来改进模型以使其不可变,以及使用 Curry 框架 (https://github.com/thoughtbot/Curry) 而不是创建自己的柯里化初始化程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多