Разбор Json объекта внутри Json объекта Swift 5 - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь проанализировать некоторые json в Xcode, которые в основном представляют собой набор объектов в объекте. json выглядит следующим образом.

{"TDOC": {
"assetType": "EQUITY",
"assetMainType": "EQUITY",
"cusip": "87918A105",
"symbol": "TDOC"}}

Я анализирую его, используя приведенный ниже код в Xcode, используя swift5

do {            
   if let json = try JSONSerialization.jsonObject(with: jData, options: []) as? [String: Any] {
      if let pr = json["TDOC"] as? Array<Dictionary<String, Any>> {
         for p in pr {
             print(p["assetType"] ?? "")
         }
      }
   }
} catch let err {
   print(err.localizedDescription)
}

Я пытаюсь получить значение assetType, но когда Я запускаю код, ничего не выводится на консоль. Когда я отлаживаю, кажется, что XCode просто пропускает мое значение в l oop, потому что по какой-то причине печатает assetType. Любая помощь по этому вопросу приветствуется.

Ответы [ 3 ]

1 голос
/ 22 января 2020

Вы не можете рассматривать TDOC объект как массив. Поскольку это объект словаря, вы можете принять его как Dictionary напрямую.

Вы можете сделать это следующим образом.

do {

    if let json = try JSONSerialization.jsonObject(with: jData, options: []) as? [String: Any] {

        if let pr = json["TDOC"] as? Dictionary<String, Any> {
            print(pr["assetType"])
        }
    }

} catch let err {

    print(err.localizedDescription)
}
0 голосов
/ 22 января 2020

1. Создайте отражающий класс ваших данных и приведите их в соответствие с протоколом Codable

    import Foundation

    // MARK: - Welcome
    struct MyObject: Codable {
        let tdoc: Tdoc

        enum CodingKeys: String, CodingKey {
            case tdoc = "TDOC"
        }
    }

    // MARK: - Tdoc
    struct Tdoc: Codable {
        let assetType, assetMainType, cusip, symbol: String
    }

1. Разобрать его с помощью JSONDecoder:

    do {

           let myObject = try JSONDecoder().decode(MyObject.self, from: jsonData)
           print(myObject.tdoc.assetType)

    } catch {
           print(error)
    }

вот что делает яблоко c для получения более подробной информации о протоколах Encoding, Decoding и CodingKeys

https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types

Надеюсь, это поможет :)

0 голосов
/ 22 января 2020

Попробуйте это.

Ключ "TDO C" соответствует значению словаря, а не массива. Нет, для l oop тоже нужно.

do {

    if let json = try JSONSerialization.jsonObject(with: jData, options: []) as? [String: Any] {

        if let pr = json["TDOC"] as? [String: Any] {

                print(pr["assetType"])
        }
    }

} catch let err {

    print(err.localizedDescription)
}

Надеюсь, это поможет.

...