来自字典的JSON编码[无法调用' dataWithJSONObject ...]

时间:2015-08-05 07:39:43

标签: ios objective-c json swift swift2

我有一本字典:

    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)

但是我收到了这个错误:

  

无法使用类型的参数列表调用dataWithJSONObject   '([字符串:[(布尔,布尔)]]!选项:NSJSONWritingOptions,误差:无)'

3 个答案:

答案 0 :(得分:3)

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

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

  

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

     
      
  • 顶级对象是NSArray或NSDictionary。

  •   
  • 所有对象都是NSString,NSNumber,NSArray,NSDictionary或的实例   NSNull。

  •   
  • 所有字典键都是NSString的实例。

  •   
  • 数字不是NaN或无穷大。

  •   

答案 1 :(得分:1)

我重写了你的例子,它使用了一个数组而不是元组。因为#!/bin/bash LD_LIBRARY_PATH=$(dirname $(which your_file)) your_file 无法处理元组,因为JSON中没有这样的东西。

NSJSONSerialization

答案 2 :(得分:0)

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)