2016-10-31 5 views
1

私はカードを記述する私のswiftクラス内の構造を持っており、保存時にファイルに書き出されるJSONとして持っていたいと思います。swift error:JSONの書き込みに無効なトップレベルのタイプがあります

私の問題は、NSJSONSerialization中にトップレベルのtypが間違っているというエラーが表示されます。これは正確なエラーです:

NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write 

以下は、私の構造体とmyTJSON()関数の名前付きエラーです。

struct CardStructure { 
    var UUID: NSUUID = NSUUID.init() 
    var Chapter: Int = 0 
    var Card: Int = 0 
    var CorrectAnswers: Int = 0 
    var WrongAnswers: Int = 0 
    var Unknown: Int = 0 
    var LastAsked: String = "" 
    var Question: String = "" 
    var Answer: String = "" 
    var Hint: String = "" 
    var Tags: [String] = [] 
    var Links: [String] = [] 
    var Picture: String = "" 

    func toJSON() -> String? { 
     let props = ["UUID": String(describing: UUID), 
        "Chapter": Chapter, 
        "Card": Card, 
        "Question": Question, 
        "Answer": Answer, 
        "Hint": Hint, 
        "Tags": Tags, 
        "Links": Links, 
        "Picture": Picture 
        ] as [String : Any] 
     do { 
      let jsonData = try JSONSerialization.data(withJSONObject: props, 
                     options: .prettyPrinted) 
      return String(data: jsonData, encoding: String.Encoding.utf8) 
     } catch let error { 
      print("error converting to json: \(error)") 
      return nil 
     } 
    } 
} 

このエラーがなぜ発生するのかはわかりません。誰も私を助けることができます???リンクには、このように、提供するソリューションを適応させるために、私は、このエラーに関する他の記事でヒントを理解しようとしましたが、これまでのところ、迅速に私の知識が低すぎる:

invalid-top-level-type-in-json-write

敬具、

クリス

+1

'print(CardStructure().JSON())'は問題なく動作します。問題を示す(最小限の)自己完結型の例を投稿できますか? –

+0

'String(description:UUID)'を 'UUID.uuString'で置き換えてください。 – Moritz

答えて

-1

私は元々の質問は

... ...ではなくCardStrucure自体のインスタンスのCardStructureのプロパティをシリアル化するコメントはそれを参照するので、以下のオリジナルの答えを残す程度であったことを逃しました

私は、上記のコードをmacOSとiOSプレイグラウンドの両方で以下の2行で試してみました。コードは問題なく正常に実行されました。どのバージョンのXcode、Swiftなどをお使いですか?

let cs = CardStructure() 
let str = cs.toJSON() 

- オリジナル答え

あなたがここにJSONSerializationのドキュメントを参照している場合:

https://developer.apple.com/reference/foundation/jsonserialization

あなたは、それは次のように言及していることがわかります:

An object that may be converted to JSON must have the following properties:

The top level object is an NSArray or NSDictionary. 

All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull. 

All dictionary keys are instances of NSString. 

Numbers are not NaN or infinity. 

ので、あなたのトップレベルのオブジェクトであるCardStructureはそうではありませんNSArrayまたはNSDictionary、エラーは正しいようです。

+1

はい、しかし、OPは構造体ではなく' props'辞書をシリアライズしています。 – Moritz

+0

ああ、それを逃して、ごめんなさい:)実際には、私はちょうどmacOSのプレイグラウンドでコードをテストし、コンパイルし、正常に実行されます - シリアル化でエラー... – Fahim

関連する問題