【问题标题】:How to display parsed JSON data in Swift?如何在 Swift 中显示解析的 JSON 数据?
【发布时间】:2018-06-19 20:13:04
【问题描述】:

通过 API 调用解析 JSON 后,我无法将解析的 JSON 转换为我想要在 ViewController 中显示的数据。我能够在控制台中打印 JSON 数据,但我不能只从我想要显示的数据中获取“word: ..”的值。这是 JSON 对象的示例:

{
  "metadata": {},
  "results": [
    {
      "id": "eurhythmic",
      "word": "eurhythmic"
    }
  ]
}

我使用的结构如下:

// Struct RandomWords
struct StoreRandomWords: Codable {
    let results: [Result]
}

struct Result: Codable {
    let word: String
}

从 API 获取数据的代码:

func fetchRandomWord(completion: @escaping (StoreRandomWords?) -> Void) {
        let language = "en"
        let filters = "registers%3DRare%3Bdomains%3DArt?"
        let limit = "limit=1"
        let url = URL(string: "https://od-api.oxforddictionaries.com:443/api/v1/wordlist/\(language)/\(filters)\(limit)")!
        var request = URLRequest(url: url)
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.addValue(appId, forHTTPHeaderField: "app_id")
        request.addValue(appKey, forHTTPHeaderField: "app_key")

        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            if let data = data {
                do {
                let jsonData = try JSONDecoder().decode(StoreRandomWords.self, from: data)
                print(jsonData)
                } catch {
                    print(error)
                }
            } else {
                print(error)
                print(NSString.init(data: data!, encoding: String.Encoding.utf8.rawValue)!)
            }
        }
        task.resume()
    }

以及我要在其中加载“单词”的 ViewController 中的代码:

// Do any additional setup after loading the view.
override func viewDidLoad() {
    super.viewDidLoad()

    // Fetch data for Daily Word.
    ContextController.shared.fetchRandomWord( completion: { (storeRandomWord) in
        if let storeRandomWord = storeRandomWord {
          //

        }
    })
  }

这在控制台中给了我这个输出:

StoreRandomWords(results: [GetContext.Result(word: "eurhythmic")])

我的目标是从字面上显示价值词,这里是“有节奏的”。

(我是初学者,不是以英语为母语的人,所以任何关于如何改进代码或问题的反馈都会有所帮助并欢迎。)

【问题讨论】:

  • jsonData.results.first?.word 或者如果您实际上通过附件返回了结果storeRandomWord.results.first?.word
  • 第一个对我有用,第二个不行。当我将控制台放入机箱时,控制台什么也没打印,试图打印一个“hello,world”,但即使这样也没有输出任何东西。
  • 嗯,根据您的代码,我没有看到您正在调用完成处理程序的任何地方
  • 哇,我不敢相信我错过了。非常感谢!节省了我很多时间。

标签: ios json swift


【解决方案1】:

您将不得不循环数组或访问索引科学 storeRandomWords.results 是一个数组。

例如打印第一个结果:

if let storeRandomWord = storeRandomWord {
    print(storeRandomWord.results.first.word)
}

【讨论】:

  • 我已经尝试过你的代码,它运行良好,但你对通过数组循环的建议让我一无所知。你能澄清一下吗?我想要的值是数组中的字符串:let etymologies: [String]? 打印数组中的字符串:Optional(["....")] 但是每当我尝试获取字符串时,它都会导致“无法将 Swift.array 类型的值转换为 Swift.string " 发生在:self.etymologies = (storeWordDescription.results.first?.lexicalEntries.first?.entries.first?.etymologies as Any) as! String 我已经尝试过循环,但我很难过。
  • 你必须循环结果:for result in storeRandomWord.results{ print(result.lexicalEntreis) } 似乎对象 lexicalEntries 和 Entries 是数组,所以你将不得不循环
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2018-11-21
  • 2016-09-09
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多