Невозможно проанализировать JSON в Swift 4 - PullRequest
0 голосов
/ 29 октября 2018

У меня проблема с получением значения из JSON в swift 4.

{
    "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], он возвращает нулевое значение. Может кто-нибудь дать мне совет.

ответ [ "JSON"]

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Лучший способ - использовать 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)
}
0 голосов
/ 29 октября 2018

Заменить AnyObject на Any. Словари являются структурами, а не объектами, поэтому приведение не удастся.

Я бы также предложил узнать о Codable для работы с JSON в будущем.

Edit:

Сначала вам нужно будет сериализовать ваши данные в объект 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...