【问题标题】:Parsing Json object within a Json Object Swift 5在 Json 对象 Swift 5 中解析 Json 对象
【发布时间】:2020-05-08 03:30:49
【问题描述】:

我正在尝试在 Xcode 中解析一些 json,这些 json 基本上是一个对象中的一堆对象。 json 如下所示。

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

我正在使用 swift5 在 Xcode 中使用以下代码对其进行解析

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 只是跳过了我的 for in 循环,因为它出于某种原因打印了assetType。对此的任何帮助表示赞赏。

【问题讨论】:

    标签: json swift xcode parsing swift5


    【解决方案1】:

    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)
        }
    

    这里有一个苹果文档,可获取有关编码、解码和 CodingKeys 协议的更广泛信息

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

    希望这会有所帮助:)

    【讨论】:

      【解决方案2】:

      您不能将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)
      }
      

      【讨论】:

      • 很高兴为您提供帮助!请点赞并标记为已接受,这将对面临类似问题的其他人有所帮助
      【解决方案3】:

      试试这个。

      “TDOC”键对应一个字典值,而不是一个数组。也不需要 for 循环。

      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)
      }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 2020-09-05
        • 2020-09-22
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多