使用JSONSerialization进行foundation对象和json的互转

 
 

Foundation对象转为JSON数据

首先要注意,能转为JSON的Foundation对象必须满足:

  1. 顶层对象必须是NSArray或NSDictionary。也就是说字符串、NSNumber类型是不能转为JSON的。
  2. 所有的对象必须是NSString,NSNumber,NSArray,NSDictionary或者NSNull。
  3. 所有字典的key必须是NSString类型。
  4. 所有的NSNumber不能为非数字或无穷大。
        let aDic = ["key1":100, "key2":"一天"] as [String : Any]
        
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: aDic, options: [])
            print(jsonData)
        }
        catch {
            print(error)
        }

代码说明:

  1. 对象转JSON的options貌似只有一个prettyPrinted,当然我这里直接空着了。
  2. aDic如果不是字典或数组,按理说应该抛出异常,为什么我直接奔溃了。
  3. 生成的JSONdata是utf8的。

我们可以使用下面代码判断一个对象是否能转为JSON:

        if JSONSerialization.isValidJSONObject(strangeString) {
            print("是是是")
        }

JSON对象转Foundation对象

下面就是将一个json data转为Foundation对象的过程:

        do {
            let dic = try JSONSerialization.jsonObject(with: data, options:.allowFragments)
            print(dic)
        }
        catch {
            print(error)
        }

options说明:
NSJSONReadingAllowFragments:表示data的最外层数据非字典或数组的情况下也可以成功。如果是数组或字典也会成功的。如:

        let string = "123"
        let data = string.data(using:.utf8)!
        do {
            let dic = try JSONSerialization.jsonObject(with: data, options:.allowFragments)
            print(dic)
        }
        catch {
            print("异常了")
        }
输出:
123

mutableContainers:表示将data数据转为可变的数组或字典,如果data数据既不是数组也不是字典,或者说格式错误,那么返回nil并抛出错误。

        let string = "123"
        let data = string.data(using:.utf8)!
        do {
            let dic = try JSONSerialization.jsonObject(with: data, options:.mutableContainers)
            print(dic)
        }
        catch {
            print("异常了")
        }
输出:
异常了

NSJSONReadingMutableLeaves::表示如果data是字典或数组的前提下,将data转为可变字符串。

        let string = "[123]"
        let data = string.data(using:.utf8)!
        do {
            let dic = try JSONSerialization.jsonObject(with: data, options:.mutableLeaves)
            print(dic)
        }
        catch {
            print("异常了")
        }
输出:
(123)

一般使用NSJSONReadingAllowFragmentsmutableContainers就行了。

特殊情况处理:

在和js后台交换数据时,会出现这么种情况:字典的key不是String类型的。要知道js的json允许这么做,但是IOS的JSONSerialization是不允许的。于是会出现这么种数据:

"{Items:2,total:2}"

这个数据我们解析的时候回抛出异常,因为这顶层是{}包围的字典格式,但是内部却不是我们要求的key是字符串。

解决方法:地址
找到一个在Swift里使用的js解释器:WKWebView

import WebKit
class JavascriptJSONjavascript: NSObject {
    private static let webView = WKWebView()
    
    class func parse(jsonString: String, completionHandler: @escaping (Any?, Error?) -> Void) {
        self.webView.evaluateJavaScript(jsonString, completionHandler: completionHandler)
    }
}
    func doLeftAction() {
        let str = "{Items:2,total:2}"
        JavascriptJSONjavascript.parse(jsonString: "tmp = \(str)", completionHandler: { (result, error) in
            guard error == nil else {
                print(error!)
                return
            }
            if let dict = result as? [String: AnyObject] {
                print(dict)
            }
            else {
                print("Can't convert to Dictionary")
            }
        })
    }


作者:桃花流水鳜鱼肥
链接:http://www.jianshu.com/p/f557c1bfdfe8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSON(JavaScript Object Notation)是一种用于数据交换的轻量级文本格式,在Web开发中被广泛使用。而IFC2x3(Industry Foundation Classes)是一种用于建筑工程领域的信息交换标准。 要将JSON转换为IFC2x3格式,首先需要了解两者的数据结构和语义之间的差异。JSON通常以键值对的形式组织数据,而IFC2x3使用一种类似XML的层次结构来建模建筑元素和关联关系。 转换的过程主要包括以下几个步骤: 1. 解析JSON数据:使用合适的编程语言或工具对JSON进行解析,将其转换为内部数据结构,如字典或对象。 2. 创建IFC模型:根据IFC2x3规范,创建一个空的IFC模型,并初始化一些必要的基本信息,如项目名称、版本号等。 3. 遍历JSON数据:根据JSON的结构,逐级遍历其中的键值对,将数据映射到IFC模型的对应实体和属性。 4. 创建IFC实体:根据JSON中的数据,在IFC模型中创建相应的实体,如墙体、楼板等。同时,根据JSON中的关联关系,建立实体之间的关系。 5. 设置属性值:根据JSON中的属性值,设置对应实体的属性。例如,设置墙体的长度、高度等属性。 6. 导出为IFC文件:将转换后的IFC模型导出为IFC2x3格式的文件,以便在其他IFC兼容的软件中使用。 需要注意的是,JSON和IFC2x3是两种不同的数据表示形式,转换可能涉及到一些数据类型或数据结构的转换,例如将JSON中的字符串转换为IFC中的枚举类型。此外,转换的准确性和完整性也取决于JSON数据质量和IFC模型的规范性。 总之,将JSON转换为IFC2x3需要理解两者之间的差异,遍历和映射JSON数据到IFC模型,并将其导出为IFC文件,以实现数据的转换和交换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值