Разбор вложенного оператора JSON с массивами в Swift 4 - PullRequest
0 голосов
/ 24 января 2019

Я оглянулся, но не смог найти ответ на мою проблему. Я новичок в кодировании и использую этот пример, чтобы попасть в предмет. Я хочу проанализировать вложенный оператор JSON, код, который я использую для проверки, выглядит следующим образом:

import Foundation

let jsonDict = """
{"Data":[{"id": 40, "val": 600,"valStr": "600","sysVal": "580","inst": 0,"valid": "true"},
{"id": 44, "val": 600,"valStr": "600","sysVal": "580","inst": 0,"valid": "true"}]}
""".data(using: .utf8)!
print("IF statement ")


let json = try? JSONSerialization.jsonObject(with: jsonDict, options: .allowFragments) as! [String: Any]
if let dictionary = json as? [String: Any],
    let data = dictionary["Data"]
{
    print("Data= \(data)")
}

Я могу получить доступ ко всему содержимому корневого элемента, но не к элементам в массиве. Я был бы очень рад за любую помощь здесь.

1 Ответ

0 голосов
/ 24 января 2019

Drop JSONSerialization и использовать Decodable.Это более наглядно и более эффективно.

result - это структура Root, представляющая внешний словарь.Ключи словаря становятся членами структуры.

let jsonString = """
{"Data":[{"id": 40, "val": 600,"valStr": "600","sysVal": "580","inst": 0,"valid": "true"},
{"id": 44, "val": 600,"valStr": "600","sysVal": "580","inst": 0,"valid": "true"}]}
"""

let data = Data(jsonString.utf8)

struct Root : Decodable {
    private enum CodingKeys : String, CodingKey { case data = "Data"}

    let data : [Subject]
}

struct Subject : Decodable {
    let id, val, inst : Int
    let valStr, sysVal, valid : String
}

do {
    let result = try JSONDecoder().decode(Root.self, from: data)
    for item in result.data {
        print(item.id, item.val, item.valid)
    }
} catch { print(error) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...