JSON 从字典编码 [无法调用 'dataWithJSONObject ...]

JSON Encoding from Dictionary [ Cannot invoke 'dataWithJSONObject ...]

我有一本字典:

    var schedule : [String:[(Bool,Bool)]]!//[Day:[(AMenabled:PMenabled)]]

我想将它解码为 json 文件,然后将其发送到服务器

调度对象是这样的:

        ["Sat":[ (true,true),
             (false,true),
             (false,false),
             (false,true),
             (false,false),
             (false,true),
             (false,false),
             (false,true),
             (false,false),
             (false,true),
             (false,false),
             (true,true)
        ],
        "Sun":[ (true,true),
            (false,true),
            (true,true),
            (false,true),
            (true,true),
            (false,true),
            (true,true),
            (false,true),
            (true,true),
            (false,true),
            (true,true),
            (false,true)
        ],
        "Mon":[ (true,true),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (true,false),
            (true,true)

        ],
        "Tue":[ (true,true),
            (false,true),
            (false,false),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),

            (false,true)
        ],
        "Wed":[ (true,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,true),
            (true,true),
            (true,true)
        ],
        "Thur":[ (true,true),
            (false,true),
            (true,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false)
        ],
        "Fri":[ (true,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,false),
            (false,true),
            (false,true),
            (true,true),
            (true,false)
        ]
    ]

我想解码成这样的 JSON 文件:

{
"parental_control": {
    "user_id": 57,
    "profile": 1,
    "chat": false,
    "forum_read": false,
    "forum_write": false,
    "days": [
        [
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true
        ],
        [
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true
        ],
        [
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true
        ],
        [
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true
        ],
        [
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true
        ],
        [
            true,
            false,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            false,
            true
        ],
        [
            true,
            false,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            false,
            true
        ]
    ]
}
}

所以在不关心 json 文件中的 parentalcontrol 和其他键的情况下,如何实现到 json 文件的映射:

我试过什么?

我试过使用内置 NSJSONSerialization

var json = NSJSONSerialization.dataWithJSONObject(self.schedule, options: NSJSONWritingOptions.PrettyPrinted,error: nil)

但我收到此错误:

cannot invoke dataWithJSONObject with an argument list of type '([String:[(Bool,Bool)]]!,options:NSJSONWritingOptions,error:nil)'

您收到的错误是因为 NSJSONSerialization 在序列化您的 (Bool, Bool) 元组时遇到问题(元组在 JSON 中不可用)。您必须将它们转换为适当的类型才能序列化它们。

还有,这里是NSJSONSerialization documentation的第一段。您可以将其用作有效类型的参考(请注意 Swift 的各个类型,如字符串、数组、字典等当然会按预期工作):

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.

我重写了您的示例,它使用数组而不是元组。因为 NSJSONSerialization 无法处理元组,因为 JSON.

中没有这样的东西
var days = ["Mon", [true, false]]

let json = NSJSONSerialization.dataWithJSONObject(days, options: NSJSONWritingOptions.PrettyPrinted, error: nil)
let _days = NSJSONSerialization.JSONObjectWithData(json!, options: NSJSONReadingOptions.allZeros, error: nil) as! Array<AnyObject>

println(_days[0]) // prints Mon
println(_days[1][0]) // prints 1

NSJSONSerialization 不包含元组,因此您可以将 schedule 定义为:

var schedule : [String:[Array<Bool>]]!

schedule 中插入数据:

schedule =  ["Sat":[ [true,true],
      [false,true],
      [false,false],
      [false,true],
      [false,false]
      ],
      "Sun":[ [true,true],
        [false,true],
        [true,true],
        [false,true],
        [true,true],
        [false,true]
      ]]

现在您可以将其转换为 JSON 数据:

var jsonData = NSJSONSerialization.dataWithJSONObject(self.schedule, options: NSJSONWritingOptions.PrettyPrinted,error: nil)