我尝试在swift中解码JSON字符串,但在解码后访问属性时遇到了一些奇怪的问题。
这是我从本地存储的JSON文件中检索的JSON文件的内容
[
{
"word": "a",
"usage": [
{
"partOfSpeech": "determiner"
}
]
}
]
这是访问JSON文件属性的代码
struct WordDictionary : Codable {
var word: String
var usage: [Usage]
}
struct Usage: Codable {
var partOfSpeech: String
}
if let url = Bundle.main.url(forResource: FILE_NAME, withExtension: "json") {
do {
let data = try Data(contentsOf: url)
let decoder = JSONDecoder()
let jsonData = try decoder.decode([WordDictionary].self, from: data)
print(jsonData[0].word) //Outputs "a"
print(jsonData[0].usage) //Outputs "[MyApp.AppDelegate.(unknown context at $102a37f00).(unknown context at $102a38038).Usage(partOfSpeech: "determiner")]"
} catch {
print("error:\(error)")
}
}
正如您所看到的,当我尝试print(jsonData[0].usage)
时,我在得到“Usage”属性之前得到了一系列未知的数据消息。当我打印这一行时,我只想看到determiner
,我不确定关于“未知上下文”的序言是什么。
我也在AppDelegate
的didFinishLaunchingWithOptions
函数中运行这段代码。
我不知道我错过了什么。我一直试图找到一个解决方案,现在几天,并尝试不同的方法,但仍然不能得到所需的输出,任何帮助将不胜感激。
2条答案
按热度按时间ssm49v7z1#
医生
您的类型是在函数中定义的。请将这些类型定义移到函数之外,或者实现您自己的
CustomStringConvertible
一致性。这是在哪里定义类型的问题。
请考虑:
产生:
[MyApp.AppDelegate.(位于$102bac454的未知上下文).(位于$102bac58c的未知上下文).用法(partOfSpeech:“限定词”)]
也就是说,
Usage
是在MyApp
中的AppDelegate
中的某个未知上下文中定义的。简而言之,它不知道如何表示函数中定义的类型的层次结构。与之形成对比的是:
其产生:
[我的应用程序。应用程序委托。用法(部分语音:“限定词”)]
您还可以添加自己的
CustomStringConvertible
一致性:其产生:
用法(词性:“限定词”)]
通过
CustomStringConvertible
,您可以将print
化为您想要的任何格式。vjhs03f72#
如果希望在将一个类型的示例插入字符串时,该类型能够很好地打印出来,则需要使其符合CustomStringConvertible。
此协议声明一个属性:
description
,当字串插补遇到符合它的对象时,它会改用description
传回的字串。您需要以下内容:
如果要打印类似 * 字符串的JSON。
另一种方法是使用
JSONEncoder
对对象进行重新编码,并将数据转换为String
。这要重得多,但对于更复杂的对象可能是更好的选择。"
和\
也不会被转义。