不幸的是,我没有找到任何对互联网上写 JSON数据有用的东西。我想问一下我要做什么让一个类成为一个'有效的JSON对象',可以使用NSJSONSerialization.dataWithJSONObject(<AnyObject>, options: .allZeros, error: nil)
转换为JSON。数据必须是String
或NSNumber
之类的值,还是Array<AnyObject>
或Dictionary<String, AnyObject>
之类的对象,这些对象可以很容易地用JSON表示,或者在那里转换JSON对象的任何其他可能性?谢谢你的回答
答案 0 :(得分:1)
根据docs明确的方式是致电isValidJSONObject:
或尝试:
可以转换为JSON的对象必须具有以下内容 属性:
- 顶级对象为
NSArray
或NSDictionary
。- 所有对象都是
NSString
,NSNumber
,NSArray
,NSDictionary
或NSNull
的实例。- 所有词典键都是
的实例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!)