美文网首页
JSONSerialization ReadingOptions

JSONSerialization ReadingOptions

作者: tom__zhu | 来源:发表于2023-08-27 08:47 被阅读0次

    这两个值通常在序列化和反序列化时被使用,例如Data和JSON互转。先看一下他们各自有哪些选项可用。

    extension JSONSerialization {
    
        
        @available(iOS 5.0, *)
        public struct ReadingOptions : OptionSet, @unchecked Sendable {
    
            public init(rawValue: UInt)
    
            
            public static var mutableContainers: JSONSerialization.ReadingOptions { get }
    
            public static var mutableLeaves: JSONSerialization.ReadingOptions { get }
    
            public static var fragmentsAllowed: JSONSerialization.ReadingOptions { get }
    
            
            @available(iOS 15.0, *)
            public static var json5Allowed: JSONSerialization.ReadingOptions { get }
    
            @available(iOS 15.0, *)
            public static var topLevelDictionaryAssumed: JSONSerialization.ReadingOptions { get }
    
            
            @available(iOS, introduced: 5.0, deprecated: 100000, renamed: "JSONSerialization.ReadingOptions.fragmentsAllowed")
            public static var allowFragments: JSONSerialization.ReadingOptions { get }
        }
    
        
        @available(iOS 5.0, *)
        public struct WritingOptions : OptionSet, @unchecked Sendable {
    
            public init(rawValue: UInt)
    
            
            public static var prettyPrinted: JSONSerialization.WritingOptions { get }
    
            
            /* Sorts dictionary keys for output using [NSLocale systemLocale]. Keys are compared using NSNumericSearch. The specific sorting method used is subject to change.
             */
            @available(iOS 11.0, *)
            public static var sortedKeys: JSONSerialization.WritingOptions { get }
    
            public static var fragmentsAllowed: JSONSerialization.WritingOptions { get }
    
            @available(iOS 13.0, *)
            public static var withoutEscapingSlashes: JSONSerialization.WritingOptions { get }
        }
    }
    

    上面是Xcode接口文档的描述。


    ReadingOptions

    使用场景
    ReadingOptions的作用是用来反序列化Data时的参数

    示例

    let object: Any = try JSONSerialization.jsonObject(with: data, options: opt)
    

    解释

    • mutableContainers:得到一个可变的容器对象(Array, Dictionary)
    • mutableLeaves:得到一个可变的叶子节点(JSON叶节点如果是String,按理会得到可变的String)
    • fragmentsAllowed:除了Array,Dictionary以外,允许其他类型作为顶层,例如String、Number、Null、BooL(常用)
    • json5Allowed:支持JSON5的语法#
    • topLevelDictionaryAssumed:允许最外层没有括号包裹的JSON数据的解析
    • allowFragments:会被废弃,建议fragmentsAllowed

    WritingOptions

    使用场景
    WritingOptions的作用是用来序列化JSON时的参数

    示例

    let jsonObjc = JSONSerialization.data(withJSONObject: json, options: [])
    

    解释

    • prettyPrinted : 转换的JSON对象会通过换行和缩进,使JSON美观易读
    • sortedKeys : 转换后的JSON对象会按照Key升序排序(内外层都排序)
    • fragmentsAllowed : 允许除了Array、Dictionary的对象作为最外层
    • withoutEscapingSlashes : 去除转换后JSON中的转移字符"/"

    举例

    • prettyPrinted
    let json: [String: Any] = ["name": "tom", "address": ["province":"sh", "city":"sh"], "c":["c":"123","a":"321"]]
    do {
      let jsonData = try JSONSerialization.data(withJSONObject: json, options: [.prettyPrinted])
      let jsonString = String.init(data: jsonData, encoding: String.Encoding.utf8)
      print(jsonString!) 
    } catch { }
    
    输出:
    {
      "address" : {
        "province" : "sh",
        "city" : "sh"
      },
      "name" : "tom",
      "c" : {
        "c" : "123",
        "a" : "321"
      }
    }
    
    • sortedKeys
      内外层按照Key排序
    let json: [String: Any] = ["name": "tom", "address": ["province":"sh", "city":"sh"], "c":["c":"123","a":"321"]]
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: json, options: [.sortedKeys,.prettyPrinted])
      let jsonString = String.init(data: jsonData, encoding: String.Encoding.utf8)
      print(jsonString!)
    
    } catch { }
    
    输出:
    {
      "address" : {
        "city" : "sh",
        "province" : "sh"
      },
      "c" : {
        "a" : "321",
        "c" : "123"
      },
      "name" : "tom"
    }
    
    • fragmentsAllowed
      JSON最外层可以使用除Array、Dictionary的类型。 例如 Number、String、Bool、Null。否则默认只允许Dictionary、Array作为JSON最外层
    let json = 123456
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: json, options: [.sortedKeys,.prettyPrinted])
      let jsonString = String.init(data: jsonData, encoding: String.Encoding.utf8)
      print(jsonString!)
    
    } catch { }
    
    输出:
    123456
    
    • withoutEscapingSlashes
    struct User: Codable {
        let name: String
        let age: String
    }
    
    let user = User(username: "Tom", profileURL: "http://iqiyi.com")
    
    let jsonEncoder = JSONEncoder()
    jsonEncoder.outputFormatting = .withoutEscapingSlashes
    let json = try? jsonEncoder.encode(user)
    
    if let data = json, let str = String(data: data, encoding: .utf8) {
        print(str)
    }
    
    
    输出:
    {"profileURL":"http://iqiyi.com","username":"Tom"}  // 这里没有转义字符
    

    相关文章

      网友评论

          本文标题:JSONSerialization ReadingOptions

          本文链接:https://www.haomeiwen.com/subject/fwgimdtx.html