2017-01-11 2 views
0

JSONSerialization.data(withJSONObject:options:)はJSONにソートされた辞書をシリアライズすることはできませんスウィフト3

シリアライズがソートされていない辞書で動作しますが、ソートされたアプリで記述してエラーをスローを経由してJSONに私のソートされた辞書をシリアライズすることはできません

func createJSONFile(){ 
    // create path to json file 
    let fileManager = FileManager.default 
    let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask) 
    let documentDirectory = urls[0] as NSURL 
    guard let jsonURL = documentDirectory.appendingPathComponent("graphData") else { 
     print("Failed to create path to json file.") 
     return 
    } 

    print(jsonURL.absoluteString) 
    // creating a .json file in the Documents folder 
    if !fileManager.fileExists(atPath: jsonURL.absoluteString){ 
     fileManager.createFile(atPath: jsonURL.absoluteString, contents: nil, attributes: nil) 
     print("file created") 
    } 

    do { 
     let unsortedDic = self.tempDictionaryForJsonFile 
     let sortedDic = unsortedDic.sorted(by: <) 
     let jsonData = try JSONSerialization.data(withJSONObject: sortedDic, options: .prettyPrinted) 
     print(jsonData) 
     try jsonData.write(to: jsonURL) 

     print(fileManager.fileExists(atPath: jsonURL.absoluteString)) 

     let content = try String.init(contentsOf: jsonURL, encoding: .utf8) 
     print(content) 

    } catch { 
     print(error.localizedDescription) 
    } 
} 

インスペクタでソートされていない辞書をデバッグすると、次のようになりながら、ことは興味深いです::私の方法は次のようになりますunsorted dictionaryとソートされたこのようになりますsorted dictionary

この問題の解決にお役立てください。

+0

「辞書」には順序がありません。 –

答えて

1

まず、Swift stdlib(JSONオブジェクトは順序付けされていません)のソートされたディレクトリはありません。辞書の.sorted()を呼び出すと、キー/値のペア[(Key, Value)]の配列が返されます。

JSONSerializationは、それがシリアライズできるかについてのルールがあります。

  • トップレベルのオブジェクトがたNSArrayやNSDictionaryのです。

  • すべてのオブジェクトは、NSString、NSNumber、NSArray、NSDictionary、またはNSNullのインスタンスです。

  • すべての辞書キーはNSStringのインスタンスです。

  • 数値はNaNまたは無限大ではありません。

は、彼らのNSと同等にNS-互換のコレクションからの暗黙の橋があり、その内容はにObjCで表現することができる場合にのみ、これを取得する(と(Key, Value)をすることはできません)。

これを正しく実装する方法は、ここには記載されていないtempDictionaryForJsonFileのタイプと内容に大きく依存します。また、「ソートされた辞書」(これはJSONには存在しないため、Swiftから取得する方法はありません)を使用して達成しようとしているものによって異なります。 「1つのキー/値を持つ順序付けされたJSONオブジェクトの配列」を意味していれば、それを構築できますが、このデータを消費しているものであればサポートする必要があります。

+0

情報ありがとう!私の仕事は、最後にXとYのオーディオプロットを持つJSONファイルを持つことです。明確にするために、再生中にオーディオファイルからサンプルレートを抽出し、その時点のサンプルレートの各値を[Float]配列に追加します。次に、この[Float]配列を.enumerateで実行し、キーが[Float]配列のインデックスであるDictionaryをStringにキャストし、配列の各値もStringにキャストされた辞書を構築します。最後に、この出力辞書に順序付けられていないキーがあることがわかります。 –

+0

"最後に、この出力辞書に順序付けられていないキーがあります。"正しい。すべてのSwift辞書には順序付けられていないキーがあります(JSONオブジェクトには順序付けられていないキーがあります)。それは質問の意味ですか?これらの数字のどれを文字列に変換するのかは不明です。それは非常に奇妙でエラーが発生しやすくなります(ソートする場合は正しくソートされません)。これは非常に複雑なようです。 '[Float]'をすでに持っているのであれば、それをシリアル化するだけではどうですか?あるいは、 'Record'はサンプル時間を持ち、XとYは浮動小数点数になります。 –

+0

あなたの優しい答えをありがとう。あなたがそれを投稿する前にグラフデータを[[String:Float]]配列にシリアル化することができました。ここでStringはグラフのY値(Float)のインデックスです。したがって、[ { "インデックス ":値 }、{"インデックス ":値...}。就職活動のためのテスト課題の一部でした。 –

関連する問題