一 、JSONSerialization 的介绍
Apple从 IOS5.0 推出 SDK 自带的 JSON 解析对象 NSJSONSerialization 。而在 Swift3.0 被更名为 JSONSerialization 。JSONSerialization是一个非常好用的JSON生成和解析工具,效率也比其他第三方开源项目高。
》》 使用说明:(官网说明)
JSONSerialization 能将JSON 转化成Foundation 对象,也能将Foundation对象转换生JSON。但是转换的前提条件是:
1、顶层对象必须是 Array & Dictionary 。
2、所有的对象必须是NSString,NSNumber,NSArray,NSDictionary, or NSNull 中的一个。
3、所有Dictionary的key必须是 String 。
4、Number 对象不能是非数值和无穷值。
注意: 在使用 JSONSerialization.isValidJSONObject(obj: Any) 来判断是否可以转化。
二、JSONSerialization 的使用说明
1、将Function 对象转化成 JSON 对象
// TODO : Function 对象转JSON
func functionToJSON(object:Any) -> Data {
/**
先判断是否可以转换
*/
if !JSONSerialization.isValidJSONObject(object) {
return Data.init()
}
/**
开始转换
JSONSerialization.WritingOptions.prettyPrinted 是输出JSON时的格式更容易查看。
*/
return try! JSONSerialization.data(withJSONObject: object, options: .prettyPrinted)
}
2、 将JSON 对象转化成Function 的对象
// TODO : JSON对象转Function
func JSONToFunction(AnyData:Data) -> Any {
/**
判断是否可以转换
*/
if JSONSerialization.isValidJSONObject(AnyData) {
return NSNull.init()
}
/**
开始转化
*/
return try! JSONSerialization.jsonObject(with: AnyData, options: .mutableContainers)
}
3、 上面个两个函数的使用
1、数组的转换
// 数组
let ArrayFunc = ["刘婵","小乔","吕布"]
// 转换
let ArrayJsonData = self.functionToJSON(object: ArrayFunc)
// 解码
let ArrayUJson = self.JSONToFunction(AnyData: ArrayJsonData)
// 输出
print(ArrayUJson)
/**
输出结果
(
"\U5218\U5a75",
"\U5c0f\U4e54",
"\U5415\U5e03"
)
*/
2、字典的转化
// 字典
let Dictionary = ["A":"安其拉","B":"BBB","C":"蔡文姬"]
// 转换
let DictionaryJsonData = self.functionToJSON(object: Dictionary)
// 解码
let DictionaryUJson = self.JSONToFunction(AnyData: DictionaryJsonData)
// 输出
print(DictionaryUJson)
/**
输出结果
{
A = "\U5b89\U5176\U62c9";
B = BBB;
C = "\U8521\U6587\U59ec";
}
*/
4、 JSON 对象写入一个数据流中的函数
// TODO : 将一个JSON的对象写入一个流中
func writeJSONDataToStream(jsonData:Any,stream:OutputStream) -> (Int,NSError) {
/**
判断是否可以写入
*/
var error :NSError?
if JSONSerialization.isValidJSONObject(jsonData) {
return (JSONSerialization.writeJSONObject(jsonData, to: stream, options: .prettyPrinted, error: &error),error!)
}
return (0,error!)
}
5、从一个数据流中获取JSON 对象
// TODO : 从一个流中获取数据
func getJsonAnyForStream(stream:InputStream) -> Any {
return try! JSONSerialization.jsonObject(with: stream, options: .mutableContainers)
}