【问题标题】:Unable to parse JSON in swift 4无法在 swift 4 中解析 JSON
【发布时间】:2018-10-29 15:14:31
【问题描述】:

我在 swift 4 中无法从 JSON 中获取价值。

{
    "meta": {"expiration": 0,"flags": 33456},
    "json": "{\"key\":\"string\",\"value\":{\"failed_attempts\":\"1\"}}",
    "xattrs": {}
}

我试过的代码

if let resultData = responseBody["json"] as? [String: AnyObject]{

   if let val = resultData["value"] as? [String: AnyObject]{

      if let attempt = val["failed_attempt"] as? String {
         print(attempt)

         }
    }
}

我尝试在下一行打印,它正确打印了 json 数组中的所有对象,但是当我尝试将返回类型添加为 [String: AnyObject] 时,它返回 nil 值。有人可以给我一些建议。

响应[“json”]

【问题讨论】:

  • 结果数据是什么?
  • 你应该使用 Codable for Swift 4
  • @AliAbbas 我已经编辑了代码以反映 resultData
  • [] 括号表明您的顶级 JSON 是一个数组
  • 刚刚从邮递员那里再次运行查询,它实际上是一个大括号。

标签: ios json swift parsing


【解决方案1】:

AnyObject 替换为Any。字典是结构,而不是对象,因此强制转换会失败。

我还建议将来学习 Codable 以处理 JSON。

编辑:

您需要先将数据序列化为 JSON 对象。 Data 类不会自动转换为 JSON。

do {
    let jsonRoot = try JSONSerialization.jsonObject(with: responseBody, options: []) as! [String: Any]
    if let json = jsonRoot["json"] as? [String: Any],
        let val = json["value"] as? [String: Any],
        let attempt = val["failed_attempt"] as? String {
        print(attempt)
    }
} catch {
    print("Invalid data", error)
}

【讨论】:

  • 我也尝试过 Any,但没有返回任何结果。我将尝试学习可编码的未来。
  • 等等,你是如何序列化响应的? responseBody 是 JSON 对象,还是您从服务器返回的原始数据。
  • 嗯看起来像是服务器提供的原始数据:(
  • @sjgmamer 再次检查我的答案,您需要使用JSONSerialization 将数据转换为字典。
【解决方案2】:

最好的方法是使用Codable,这就是为什么根据你的JSON字符串我创建Codable结构。

JSONString 应该是:

let jsonString = """
{ "meta": { "expiration":0, "flags":33456 },
  "json": { "key":"String",
           "value":{ "failed_attempt":"3" },
         },
 "xattrs":{ "someAttribute":"someValue"}
}
"""

还有结构:

struct Response: Codable {
    var meta: MetaData
    var json: JSONResponse
    var xattrs: Xattrs?
}

struct MetaData: Codable {
    var expiration: Int
    var flags: Int
}

struct JSONResponse: Codable {
    var key: String
    var value: JSONValue
}

struct JSONValue: Codable {
    var failed_attempt: String
}

struct Xattrs: Codable {
    var someAttribute: String
}

if let jsonData = jsonString.data(using: .utf8)
{
    let myStruct = try? JSONDecoder().decode(Response.self, from: jsonData)
    print(myStruct?.json.value.failed_attempt)
}

【讨论】:

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