2017-01-30 6 views
0

Итак, я продолжаю получать ошибку ниже, когда пытаюсь выполнить JSONSerialization на объекте JSON, который загружается для приложения, которое я создаю. В основном, я создал файл JSON, сохранил его на SugarSync и получил прямую ссылку для загрузки для загрузки и использования в моей программе. Сортировка моего собственного API-интерфейса bootleg.Разбор JSON в Swift 3 после загрузки файла JSON, NSCocoaErrorDomain Code = 3840

Я знаю, что он загружается, потому что если я преобразую файл в строку с помощью URL-адреса, он распечатает файл. Проблема в том, что я не могу пройти эту ошибку.

Ошибка домена = NSCocoaErrorDomain Code = 3840 «Нет строкового ключа для значения в объекте вокруг символа 2.»

Это пример того, как читает файл (супер просто!):

{"buddy": "pal", 
    "brother": "bear"} 

Я попытался изменить к NSData вместо данных, но это создает дополнительные проблемы. Пробовал делать NSDictionary на линии JSONSerialization, но это породило больше ошибок. Я также попробовал .mutableContainers, также безрезультатно.

Ниже приведен весь код, включая URL-адрес файла SugarSync, с тем чтобы вы могли сами воссоздать эту ошибку. Я не понимаю, что я делаю неправильно, и если кто-то может помочь, это будет потрясающе.

Спасибо!

// Create destination URL 
    let documentsURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL! 
    let destinationFileUrl = documentsURL.appendingPathComponent("downloadedFile.json") 

    // Create URL to the source file you want to download 
    let fileURL = URL(string: "https://www.sugarsync.com/pf/D7126167_796_275761334?directDownload=true") 

    let sessionConfig = URLSessionConfiguration.default 
    let session = URLSession(configuration: sessionConfig) 

    let request = URLRequest(url: fileURL!) 

    let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in 
     if let tempLocalUrl = tempLocalUrl, error == nil { 

      // Success 
      if let statusCode = (response as? HTTPURLResponse)?.statusCode { 
       print("Successfully downloaded. Status code: \(statusCode)") 

      } 

      do { 
       print("move files") 
       try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl) 

       let fileData: Data = try Data(contentsOf: destinationFileUrl, options: Data.ReadingOptions.mappedIfSafe) 

       print(fileData) 

       let myJson = try JSONSerialization.jsonObject(with: fileData, options: []) as? [[String: Any]] 

       print(myJson!) 

       do { 
        // This converts the file into String and is printed (doesn't get to this because of the error, but it works!) 
        let jsonText = try String(contentsOf: tempLocalUrl, encoding: String.Encoding.utf8) 
        print(jsonText) 


       } catch { 
        print("failed to print json file") 
       } 


      } catch (let writeError) { 
       print("Error creating a file \(destinationFileUrl) : \(writeError)") 

      } 
     } else { 
      print("Error took place while downloading file. Error description: %@", error?.localizedDescription ?? "unknown") 
     } 
    } 
    task.resume() 

EDIT --------------------------- Похоже, что сериализации является очень чувствительным. Он должен что-то подобное для работы:

{"widget": { 
"debug": "on", 
"window": { 
    "title": "Sample Konfabulator Widget", 
    "name": "main_window", 
    "width": 500, 
    "height": 500 
}, 
"image": { 
    "src": "Images/Sun.png", 
    "name": "sun1", 
    "hOffset": 250, 
    "vOffset": 250, 
    "alignment": "center" 
}, 
"text": { 
    "data": "Click Here", 
    "size": 36, 
    "style": "bold", 
    "name": "text1", 
    "hOffset": 250, 
    "vOffset": 100, 
    "alignment": "center", 
    "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
} 
}} 

Но это не будет работать:

{“website”: { 
“iPhone”: { 
    “blogURL”: ”string”, 
    “blogHead”: “string”, 
    “reportURL”: “string”, 
    “reportHead”: “string” 
} 
}} 

Примечание: этот сайт не отображается в формате JSON углублений правильно. This is where I'm getting my JSON examples.

ответ

0

Он работал в конце. Оказывается, как я заявил в своем редакции, что сериализатор json очень чувствителен. Итак, я решил использовать this JSON online editor, чтобы убедиться, что все, что мне нужно, абсолютно верно, включая правильный шрифт и размер и т. Д.

2

Вы пытаетесь разобрать JSON, который имеет тип [[String: Any]], когда JSON - это просто словарь ([String: Any]), а не массив словарей.

Попробуйте изменить это:

let myJson = try JSONSerialization.jsonObject(with: fileData, options: []) as? [String: Any] 
+0

Спасибо за ответ! Я дам ему шанс, когда я вернусь домой позже сегодня, хотя, я думаю, я тоже это пробовал. Сегодня я расскажу вам об этом. Надеюсь, что это работает! Еще раз спасибо! – Bennybear

+0

К сожалению, это не сработало. Очень жаль. Даже сделал несколько изменений в документе JSON, чтобы убедиться, что это так, но это не так. – Bennybear