简单的例子 - Argo和Swift 2

时间:2016-01-07 21:45:05

标签: json swift

我正在试图找出Argo,但即使是一个简单的例子,我也在苦苦挣扎。你如何使用Swift 2中的Argo解码以下示例Luke Skywalker JSON:

http://swapi.co/api/people/1/

这是我尝试过的一件事。

import UIKit
import Alamofire
import Argo
import Curry

struct SWPerson {
    var name: String
    var height: Int
}

extension SWPerson: Decodable {
    static func decode(j: JSON) -> Decoded<SWPerson> {
    return curry(SWPerson.init) // Error here
        <^> j <| "name"
        <*> j <| "height"
    }
}


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()


        Alamofire.request(.GET, "http://swapi.co/api/people/1/").responseJSON { response in

            if let j = response.result.value {
                let luke: SWPerson? = decode(j)
                print(luke?.name)
            }
        }
    }


}

print(luke?.name)的结果是nil。我希望Luke Skywalker

谢谢!

3 个答案:

答案 0 :(得分:2)

看起来您正在尝试解析的api中的JSON正在使用height属性的字符串。由于您已在模型上键入该属性作为Int,因此无法解析。您可以将该属性更改为String或创建String -> Int?函数。我认为它可以像<*> (j <| "height" >>- { .fromOptional(Int($0)) })一样简单。

答案 1 :(得分:1)

快速浏览一下Argo自述文件&#34; TL; DR&#34;示例表明只有第一个参数获得<^>结构;所有其他人似乎得到<*>。所以你的问题可能需要阅读:

return curry(SWPerson.init) 
  <^> j <| "name"
  <*> j <| "height"

不可否认,我从未使用过Argo或Curry,所以我可能错了,或者除此之外可能还有其他问题。

答案 2 :(得分:0)

首先要做的事情。请务必在 Podfile 中导入以下包:

use_frameworks!

target 'argoTest' do
pod 'Argo'
pod 'Curry'
end

示例1.解析结构。 这就是我们要解析的内容:

 [{
  "id": 34,
  "name": "Juan",
  "cars": []
  },{
  "id": 35,
  "name": "Paco",
  "cars": [{"year":2000,"brand":"citroen"}]
  },{
  "id": 36,
  "name": "Salvador",
  "cars": [{"year":2000,"brand":"peugeot"},{"year":2005,"brand":"renault"}]
  }]

那些建模结构

import Foundation

import Argo
import Curry

struct CarOwner {
    let id: Int
    let name: String
    let cars: [Car]?
}

extension CarOwner: Decodable {
    static func decode(j: JSON) -> Decoded<CarOwner> {
        return curry(CarOwner.init)
            <^> j <| "id"
            <*> j <| "name"
            <*> j <|| "cars" // Use ? for parsing optional values
    }
}

和这一个:

import Foundation

import Argo
import Curry

struct Car {
    let year: Int
    let brand: String
}

extension Car: Decodable {
    static func decode(j: JSON) -> Decoded<Car> {
        return curry(Car.init)
            <^> j <| "year"
            <*> j <| "brand"

    }
}

用于解析:

let carOwners:Decoded<[CarOwner]> = decode(JSONFromFile("car_owners")!)

&#34; car_owners&#34;是包含JSON的文件名。

最后,从文件中检索数据的辅助函数如下:

    import Foundation

func JSONFromFile(file: String) -> AnyObject? {
  return NSBundle(forClass: JSONFileReader.self).pathForResource(file, ofType: "json")
    .flatMap { NSData(contentsOfFile: $0) }
    .flatMap(JSONObjectWithData)
}

private func JSONObjectWithData(data: NSData) -> AnyObject? {
  return try? NSJSONSerialization.JSONObjectWithData(data, options: [])
}

private class JSONFileReader { }

示例2.解析类。这是我们要解析的内容:

{
"year": 34,
"name": "Chispa"
}

这是建模类:     进口基金会     进口Argo     import Curry

class Pet{
    var year: Int = 0
    var name: String = ""
}

extension Pet : Decodable {
    typealias DecodedType = Pet

    static func decode(json: JSON) -> Decoded<Pet> {
        let pet = Pet()
        pet.year = (json <| "year").value!
        pet.name = (json <| "name").value!


        return .Success(pet)
    }
}

最后解析:

let json: AnyObject = JSONFromFile("pets")!
let pet = Pet.decode(JSON(json))

&#34;宠物&#34;是包含json示例的文件名。

您可以在此post中找到更多示例,或访问Argo official site