如何在Swift中构造JSON数组?

时间:2019-05-07 10:02:49

标签: json swift struct

我想在Swift中构造JSON数组,以便可以使用它,但是我尝试的所有操作都会引发错误。这是我正在使用的JSON:

[
      {
      "id": 15438,
      "date": "2019-05-07T03:36:51",
      "date_gmt": "2019-05-07T00:36:51",
      "type": "post",
      "title": {
      "rendered": "Title Here"
      }
    }
 ]

这是我正在使用的代码:

struct getTitle: Decodable {
  let title: [Title]
}

struct Title: Decodable {
  let rendered: String?
}

class ViewController: NSViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    let jsonUrlString = "URL HERE"
    guard let url = URL(string: jsonUrlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data else { return }

        do {
            let titleresult = try JSONDecoder().decode(getTitle.self, from: data)
            print(titleresult)

        } catch let jsonErr {
            print("Error serializing json:", jsonErr)
        }
      }.resume()
    }
  }

它引发的错误是:

Error serializing json: typeMismatch(Swift.Dictionary<Swift.String, 
Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: 
"Expected to decode Dictionary<String, Any> but found an array 
instead.", underlyingError: nil))

我已经尝试使用

JSONDecoder().decode([getTitle].self, from: data)

将其设置为数组,但是会抛出相同的错误,但转过身来。它期望一个数组,但是找到了一个字典。

我不确定这是什么问题。我已经尝试遵循多个指南,但是它们都导致相同的结果。我做错的结构可能与某件事有关,但我不知道是什么。

3 个答案:

答案 0 :(得分:2)

请仔细,完整地阅读错误消息,它们具有极强的描述性。

  

打算解码Dictionary,但找到一个数组

表示找到的对象是一个数组。修复

JSONDecoder().decode([getTitle].self, from: data)

基本上是正确的。但是随后的错误却大不相同

  

... codingPath:[_ JSONKey(stringValue:“索引0”,intValue:0),CodingKeys(stringValue:“ title”,intValue:nil)],debugDescription:“希望对Array进行解码,但找到了字典。 “

请注意 codingPath ,它的读取方式类似于键路径[0].title:根数组第一项中的键title的值为不是一个数组,因此将结构更改为

struct getTitle: Decodable {
    let title: Title
}

读取JSON非常容易:{}是成为结构的字典,[]是数组。

最后请用首字母大写来命名结构。

答案 1 :(得分:1)

尝试一下:

struct getTitle: Decodable {
  let title: Title
}

struct Title: Decodable {
  let rendered: String?
}

class ViewController: NSViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    let jsonUrlString = "URL HERE"
    guard let url = URL(string: jsonUrlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data else { return }

        do {
            let titleresult = try JSONDecoder().decode([getTitle].self, from: data)
            print(titleresult)

        } catch let jsonErr {
            print("Error serializing json:", jsonErr)
        }
      }.resume()
    }
  }

答案 2 :(得分:0)

您有一个<div class="el-item">XXX<p class="texte-a-hover"> text </p></div>的根数组是字典而不是数组

title

struct getTitle: Codable { 
    let title: Title 
}

struct Title: Codable {
    let rendered: String
}