Swift4:从文件解码json时出错

时间:2018-01-02 12:06:24

标签: ios json swift4

这是我的第一篇文章,所以我希望一切都按照应有的结构。 我希望有人能帮助我解决我的问题。

从下载文件中解码Swift中的JSON时出现以下问题:

vocabulary.json文件包含以下内容:

[
 {
   "english": "one",
   "deutsch": "eins",
   "theme": "numbers"
 },
 {
   "english": "two",
   "deutsch": "zwei",
   "theme": "numbers"
 }
]

JSON in file

我的快速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文本不以数组或对象开头,并且选项允许未设置片段。}))

提前谢谢。

亲切的问候,

2 个答案:

答案 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。您无需计算{行中的空格:)

使用逗号解决了该问题。