0

我设置了一个提供 JSON 响应的 API,如下所示:

{
                "key1": "success",
                "key2": {
                    "int_val": 5,
                    "str_val": "email",
                }
}

我已阅读内容,但仍然不明白如何key1正确访问。我试图通过 解码转换器中的数据[String : Any],这会引发不明确的类型错误:“表达式类型不明确”。

那么如何在下面的代码中读取 Siesta 的响应呢?

service.resource("").request(.post, json: userJSON).onSuccess{ entity in
        guard let data = entity.content as? Data else {
            return
        }
        print(data)
    }
4

3 回答 3

1

你可以试试Decodable

struct Root:Decodable ( 
  let key1:String
  let key2:InnerItem
}

struct InnerItem:Decodable { 
  let intVal:Int
  let strVal:String
}

do {
    let decoder =  JSONDecoder() 
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let res = decoder.decode(Root.self,from:data)
    print(res.key1) 
}
catch {

    print(error)
 }
于 2019-01-09T21:08:59.897 回答
0

将Data对象解析为表示您的 JSON 响应的Dictionary 。

let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String : Any]

if let key1 = json["key1"] as? String {
    print(key1)
}
于 2019-01-09T21:10:35.067 回答
0

Siesta 附带的示例项目有很多配置 JSON 解码到模型的示例。例如,如果您有@Sh_Khan 的答案中的Rootand类型:InnerItem

let decoder = JSONDecoder() 
decoder.keyDecodingStrategy = .convertFromSnakeCase

service.configureTransformer(“/somepath") {
    try jsonDecoder.decode([Root].self, from: $0.content)
}

与其他答案的重要区别是使用service.configureTransformer. 不是每次使用时都解析响应,而是配置一个转换器意味着它只被解析一次,每个人都会看到解析后的结果——每个 onSuccess人,每个人都在看resource.latestData,等等。

于 2019-04-11T18:15:21.813 回答