如何使用新的可解码协议解码此JSON?

时间:2018-10-19 12:18:11

标签: json swift decodable

问题

我尝试解码JSON文件,因此将其转换为本机结构类型。显然它不起作用,我也不知道为什么。我将所有JSON对象复制到结构中,以便可解码协议可以完成其工作。

JSON文件

可以在以下位置找到JSON文件:https://pastebin.com/hZxmDMue

模型(结构)

这些是反映JSON文件中完全相同的对象的模型。

 struct Appstructure: Decodable {
  var data: [Subdata]
}

struct Subdata: Decodable {
  var favourites: Items
  var cart: Items
}

struct Items: Decodable {
  var items: [Item]
}

struct Item: Decodable {
  var type: String
  var content: Content
}

struct Content: Decodable {
  var productLines: [String]
  var productImage: String
}

JSON解析

我正在使用苹果提供的JSONDecoder,就像这样:

func fetchAppStructure() -> Appstructure? {
    guard let path = Bundle.main.path(forResource: "iMessage-test-version-3", ofType: "json") else { return nil }

    guard let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: []) else { return nil }

    do {
      try JSONDecoder().decode(Appstructure.self, from: data)
    } catch  {
      print(error.localizedDescription)
    }

    return nil
  }

错误

但是我收到以下解码错误。

 DecodingError
  ▿ keyNotFound : 2 elements
    - .0 : CodingKeys(stringValue: "cart", intValue: nil)
    ▿ .1 : Context
      ▿ codingPath : 2 elements
        - 0 : CodingKeys(stringValue: "data", intValue: nil)
        ▿ 1 : _JSONKey(stringValue: "Index 0", intValue: 0)
          - stringValue : "Index 0"
          ▿ intValue : Optional<Int>
            - some : 0
      - debugDescription : "No value associated with key CodingKeys(stringValue: \"cart\", intValue: nil) (\"cart\")."
      - underlyingError : nil
  

如果需要其他任何方法来重现此错误,请询问。这在逻辑思维上可能很小。希望有人看到这个问题!提前致谢。

1 个答案:

答案 0 :(得分:2)

您的结构错误。

子数据具有favouritescart,但不能同时具有两者。

enter image description here

favouritescart设为可选。

struct Subdata: Decodable {
  var favourites: Items?
  var cart: Items?
}