当前位置: 首页 > 面试题库 >

在Swift中解析Json

龚俊捷
2023-03-14
问题内容

我在解析Json文件时遇到问题。尝试解析一个Json文件:

{
  "id": 1234,
  "lists": {
    "pause": {
      "attached": [
        {
          "from": 1576680044000,
          "to": 1576680055000,
          "length": 11000
        }
      ]
    }
  },
  "time": {
    "start_time": 1576680044000,
    "end_time": 1576680055000
  }
}

这是我为其定义的两个结构。

暂停结构:

public struct Pause: Decodable {

   public let attached: [AttachedModel]

   init(badlAttached: [AttachedModel] = []) {
      self.attached = attached
   }

   private enum CodingKeys: String, CodingKey {
      case attached = "attached"
   }
}

AttachedModel模型结构:

public struct AttachedModel: Decodable {

   private enum CodingKeys: CodingKey {
      case from, to
   }

   public let range: Range<Int64>

   init(range: Range<Int64>) {
      self.range = range
   }

   public init(from decoder: Decoder) throws {
      do {
         let rootContainer = try decoder.container(keyedBy: CodingKeys.self)
         let from: Int64 = try rootContainer.decode(key: .from)
         let to: Int64 = try rootContainer.decode(key: .to)
         range = from ..< to
      } catch {
         throw JSONDecoder.DecodingError(type: type(of: self), payload: error)
      }
   }
}

然后,我为其创建一个键和一个函数:

   enum Key: String {
      case lists
      case pause = "pause"
   }

 func pause() throws -> Pause? {
      let seriesJSON = try lists()
      if let json = seriesJSON[Key.pause.rawValue] as? [String: Any] {
         return try JSONDecoder().decode(Pause.self, from: json) //It's never called
      } else {
         return nil
      }
   }

在功能上lists()

func lists() throws -> [String: Any] {
      let json: [String: Any] = try payload.valueForRequiredKey(Key. lists.rawValue)
      return json
   }

这是输出 list()

  [1] = {
    key = "pause"
    value = {
      payload_data_0 = 0x0000600001af8a10 {
        ObjectiveC.NSObject = {
          baseNSObject@0 = {
            isa = __NSSingleObjectArrayI
          }
        }
      }
      payload_data_1 = 0x544e786f6a497768
      payload_data_2 = 0x444f3363544e3363
      instance_type = 0x00007fe02f877ed0
    }
  }

问题是,即使pause有数据,该行也始终为假if let json = seriesJSON[Key.pause.rawValue] as? [String: Any] {,并且转到“ nil 有人可以告诉我这里的问题在哪里吗?


问题答案:

为您的json创建此模型类:

import Foundation

class MyItem: Codable {
    let id: Int
    let lists: Lists
    let time: Time
}

class Lists: Codable {
    let pause: Pause
}

class Pause: Codable {
    let attached: [Attached]
}

class Attached: Codable {
    let from, to, length: Int
}

class Time: Codable {
    let start_time, end_time: Int
}

// MARK: - Helper functions for creating encoders and decoders
fileprivate func newJSONDecoder() -> JSONDecoder {
    let decoder = JSONDecoder()
    if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
        decoder.dateDecodingStrategy = .iso8601
    }
    return decoder
}

fileprivate func newJSONEncoder() -> JSONEncoder {
    let encoder = JSONEncoder()
    if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
        encoder.dateEncodingStrategy = .iso8601
    }
    return encoder
}

然后,您可以像这样解析它:

let myItem = try? newJSONDecoder().decode(MyItem.self, from: jsonData)
// Read from (for example)
let from = myItem.lists.pause.attached[0].from


 类似资料:
  • 如有任何帮助,将不胜感激。

  • 问题内容: 我正在使用一个API,该API返回如下所示的JSON 在Swift中,我使用两个函数来获取并解析JSON 然后我用 可以很好地解析JSON。当我打印出 我得到了数组的所有内容。但是,我无法访问每个单独的索引。我很肯定这是一个数组,因为我之间 返回正确的长度。但是,如果我尝试通过使用访问单个索引 XCode关闭语法高亮显示并给我以下信息: 并且代码将无法编译。 这是XCode 6的错误,

  • 问题内容: 我正在尝试获取JSON响应并将结果存储在变量中。在以前的Swift版本中,我已经使用过此代码的版本,直到Xcode 8的GM版本发布为止。我在StackOverflow上看到了一些类似的文章:Swift 2解析JSON- 无法 在Swift 3中下标’AnyObject’类型的值和JSON解析。 但是,似乎此处传达的想法不适用于这种情况。 如何在Swift 3中正确解析JSON响应?在

  • 问题内容: 应用启动时,我需要将数据预加载到tableView中。所以我通过解析.csv文件来使用核心数据。为此,我正在关注本教程。这是我的parseCSV函数 这是我的示例.csv文件 但我在这条线上出现错误 致命错误:数组索引超出范围 我究竟做错了什么 ?请帮我。 问题答案: 您正在尝试解析文件路径而不是文件内容。 如果您更换 与: 那么代码将适用于您的示例文件。

  • 问题内容: 我是解析新手,找不到任何过时且未提出更多问题的教程。我正在尝试解析一个简单的xml文件url。xml非常简单: 并且只想将其保存为NSDictionary(标签作为键,数据作为值)。到目前为止,我所能成功完成的工作是在控制台中使用以下命令打印xml字符串: 我浏览过所有发现的在线教程,这些教程要么过时,要么过于复杂。任何帮助表示赞赏。 问题答案: 过程很简单: 创建对象,并向其传递数据

  • 问题内容: 有没有人能够找到一种在Swift 3中解析JSON文件的方法?我已经能够获得返回的数据,但是在将数据分解为特定字段方面我没有成功。我会发布示例代码,但是我经历了很多不同的方法,但是都没有成功。我想解析的基本格式是这样的。提前致谢。 问题答案: 你试过了吗? Swift有时会产生一些非常奇怪的语法。 JSON对象层次结构中的所有内容最终都被包装为可选(即)。下标返回一个非可选的。对于此J