这是我的第一篇文章,所以我希望一切都按照应有的结构。 我希望有人能帮助我解决我的问题。
从下载文件中解码Swift中的JSON时出现以下问题:
vocabulary.json文件包含以下内容:
[
{
"english": "one",
"deutsch": "eins",
"theme": "numbers"
},
{
"english": "two",
"deutsch": "zwei",
"theme": "numbers"
}
]
我的快速4 - 代码:
public struct Vocabulary: Codable{
let english: String
let deutsch: String
let theme: String
}
func decodeData(){
DataManager.getJSONFromURL("vokabeln") { (data, error) in
guard let data = data else {
return
}
let decoder = JSONDecoder()
do {
let vocabulary = try decoder.decode(Vocabulary.self, from: data)
print(vocabulary)
} catch let e {
print("failed to convert data \(e)")
}
}
}
public final class DataManager {
public static func getJSONFromURL(_ resource:String, completion:@escaping (_ data:Data?, _ error:Error?) -> Void) {
DispatchQueue.global(qos: .background).async {
let url = URL(string: "https://onedrive.live.com/xxxxx/vokabeln.json")
let data = try! Data(contentsOf: url!, options: .uncached)
completion(data, nil)
}
}
}
如果我从以下多字符串解码Json:
public let vokabeln: String = """
[
{
"english": "one",
"deutsch": "eins",
"theme": "numbers"
},
{
"english": "two",
"deutsch": "zwei",
"theme": "numbers"
}
]
"""
它可以工作,但如果我尝试从文件中解码它,我会收到以下错误消息:
无法转换数据dataCorrupted(Swift.DecodingError.Context(codingPath:[],debugDescription:“给定数据无效JSON。”,underlyingError:可选(错误域= NSCocoaErrorDomain Code = 3840“JSON文本未启动使用数组或对象和选项来允许未设置片段。“UserInfo = {NSDebugDescription = JSON文本不以数组或对象开头,并且选项允许未设置片段。}))
提前谢谢。
亲切的问候,
启
答案 0 :(得分:4)
更改此
let vocabulary = try decoder.decode(Vocabulary.self, from: data)
到这个
let vocabulary = try decoder.decode([Vocabulary].self, from: data)
它将提供Vocabulary
的数组,就像[Vocabulary]
一样。
我希望这会对你有所帮助。
答案 1 :(得分:-2)
我遇到了非常类似的错误:
捕获:dataCorrupted(Swift.DecodingError.Context(codingPath:[], debugDescription:“给定的数据不是有效的JSON。”, 底层错误:可选(错误域= NSCocoaErrorDomain代码= 3840 “字符64周围格式错误的对象。” UserInfo = {NSDebugDescription =字符周围格式错误的对象 64。})))
但是出于完全不同的原因:
我的本地json是这样创建的:
"""
{
"name": "Durian",
"rate": 600,
"city": "Cali"
"description": "A fruit with a distinctive scent."
}
"""
错误消息非常明显。我忘记将,
放在“ Cali”之后。
如果我正确理解,要计算64个字符,您必须从“名称”所在行的开始开始计数。表示每行前面有4个空字符。因此,数字约为64。您无需计算{
行中的空格:)
使用逗号解决了该问题。