Swift从AnyObject创建JSON数据

时间:2015-03-14 22:25:35

标签: json swift

不幸的是,我没有找到任何对互联网上 JSON数据有用的东西。我想问一下我要做什么让一个类成为一个'有效的JSON对象',可以使用NSJSONSerialization.dataWithJSONObject(<AnyObject>, options: .allZeros, error: nil)转换为JSON。数据必须是StringNSNumber之类的值,还是Array<AnyObject>Dictionary<String, AnyObject>之类的对象,这些对象可以很容易地用JSON表示,或者在那里转换JSON对象的任何其他可能性?谢谢你的回答

2 个答案:

答案 0 :(得分:1)

根据docs明确的方式是致电isValidJSONObject:或尝试:

  

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

     
      
  • 顶级对象为NSArrayNSDictionary
  •   
  • 所有对象都是NSStringNSNumberNSArrayNSDictionaryNSNull的实例。
  •   
  • 所有词典键都是NSString
  • 的实例   
  • 数字不是NaN或无穷大。
  •   
     

其他规则可能适用。致电isValidJSONObject:或尝试   转换是判断给定对象是否可以的明确方式   转换为JSON数据。

答案 1 :(得分:1)

NSJSONSerialization Class Reference

  

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

     
      
  • 顶级对象是NSArray或NSDictionary。

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

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

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

  •   

如果您有其他对象,则必须手动将它们转换为其中一个基本对象。所以基本上是String和NSNumber。据我所知,没有协议可以实现将您的类转换为JSONSerializable对象。

在我看来,将自己的对象转换为JSON的最佳方法是创建一个返回仅包含允许类型的字典的方法。相反,您可以创建一个带字典的init。

这样的实现看起来像这样:

class FancyObject {
    let color: UIColor
    let creationDate: NSDate
    let title: String

    init(title: String, color: UIColor) {
        self.color = color
        self.title = title
        self.creationDate = NSDate()
    }

    init(dictionary: [String : AnyObject]) {
        let colorString = dictionary["color"] as String
        self.color = UIColor(rgbaString: colorString)!
        self.title = dictionary["title"] as String
        let dateString = dictionary["creationDate"] as String
        self.creationDate = posixDateFormatter().dateFromString(dateString)!
    }

    func jsonRepresentation() -> [String : AnyObject] {
        var json = [String : AnyObject]()
        json["color"] = self.color.rgbaString()
        json["title"] = self.title
        json["creationDate"] = posixDateFormatter().stringFromDate(self.creationDate)
        return json
    }
}

如果你想在Playground玩游戏,那么引用的其他内容是:

extension UIColor {
    func rgbaString() -> String? {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        if self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) {
            return "\(red),\(green),\(blue),\(alpha)"
        }
        return nil
    }

    public convenience init?(rgbaString: String) {
        var red: Float = 0
        var green: Float = 0
        var blue: Float = 0
        var alpha: Float = 1

        let scanner = NSScanner(string: rgbaString)
        scanner.scanFloat(&red)
        scanner.scanString(",", intoString: nil)
        scanner.scanFloat(&green)
        scanner.scanString(",", intoString: nil)
        scanner.scanFloat(&blue)
        scanner.scanString(",", intoString: nil)
        scanner.scanFloat(&alpha)
        self.init(red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha: CGFloat(alpha))
    }
}

func posixDateFormatter() -> NSDateFormatter {
    let posixDateFormatter = NSDateFormatter()
    posixDateFormatter.locale = NSLocale(localeIdentifier:"en_US_POSIX")
    posixDateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
    posixDateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
    return posixDateFormatter
}

let originalObject = FancyObject(title: "Object 1", color: UIColor.magentaColor())
let originalJSONDictionary = originalObject.jsonRepresentation()
var error: NSError?
let json = NSJSONSerialization.dataWithJSONObject(originalJSONDictionary, options: NSJSONWritingOptions.PrettyPrinted, error: &error)
if json == nil {
    println("Can't create json \(error)")
}

/* JSON:
{
  "title" : "Object 1",
  "creationDate" : "2015-03-14T23:04:35Z",
  "color" : "1.0,0.0,1.0,1.0"
}
*/

let dictionaryFromJSON = NSJSONSerialization.JSONObjectWithData(json!, options: nil, error: &error) as? [String : AnyObject]
if dictionaryFromJSON == nil {
    println("Can't create dict \(error)")
}
let objectFromJSON = FancyObject(dictionary: dictionaryFromJSON!)