swift错误:JSON写入中的顶级类型无效

时间:2016-10-31 10:46:52

标签: json swift nsjsonserialization

我的swift类中有一个结构,它描述一张卡片,我希望将它作为一个JSON,在保存时写入文件。

我的问题是,我在NSJSONSerialization期间收到错误,指出顶级typ是错误的。这是确切的错误:

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

下面是我的struct和我的toJSON()函数,它给出了命名错误。

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
        }
    }
}

我对swift相当新,并且不知道为什么会导致此错误。谁能帮我???我尝试了解其他帖子中有关此错误的提示,但到目前为止,我对swift的知识太低,无法调整所提供的解决方案,如链接中的这个:

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

致以最诚挚的问候,

克里斯

1 个答案:

答案 0 :(得分:-1)

我最初错过了这个问题是关于序列化CardStructure的属性而不是CardStrucure本身的实例...由于评论引用它而留下下面的原始答案......

我刚刚在macOS和iOS Playground中使用以下两行尝试了上述代码。代码运行良好没有任何问题。您使用的是哪个版本的Xcode,Swift等?

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

- 原始答案

如果您在此处参考JSONSerialization文档:

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

您会注意到它提到了以下内容:

  

可以转换为JSON的对象必须具有以下内容   属性:

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,因此错误似乎是正确的。