我正在试图找出Argo,但即使是一个简单的例子,我也在苦苦挣扎。你如何使用Swift 2中的Argo解码以下示例Luke Skywalker JSON:
这是我尝试过的一件事。
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
。
谢谢!
答案 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。