Dictionary与String - ShenYj/ShenYj.github.io GitHub Wiki

JSON、DictionaryString

JSON、DictionaryString我们再熟悉不过了,开发中也会经常需要在Model之间进行转换, 总结一下日常开发中的使用注意

1. Model -> JSON

  • ObjectMapper

    let account = LocalManager.shared.accountRelay.value
            
    log.debug("ObjectMapper toJSON: \(account?.toJSON() ?? [:])")
    log.debug("ObjectMapper toJSONString: \(account?.toJSONString() ?? "")")
    log.debug("ObjectMapper toJSONString: \(account?.toJSONString(prettyPrint: true) ?? "")")

    打印结果:

    - ObjectMapper toJSON: ["promoted": 0, "mobilePhone": "186****9319", "userId": 0]  
    - ObjectMapper toJSONString: {"promoted":0,"mobilePhone":"186****9319","userId":0}  
    - ObjectMapper toJSONString: {  
        "promoted" : 0,  
        "mobilePhone" : "186****9319",  
        "userId" : 0  
        }  

2. Dictionary -> JSONString

需要注意转换后的JSONString是否包含转译符

如果你需要发送一段JSONString格式的数据, 那么转译符很有可能是必要的
如果你只是为了格式化查阅, 那么是不需要转译符的, 尤其是在你需要print可选值的时候

  • Model转换成JSONString

    • 可以先利用ObjectMapperModel转换成Dictionary, 再通过SwifterSwiftJSONString

      let account = LocalManager.shared.accountRelay.value
      
      let json = account?.toJSON()
      log.debug("SwifterSwift toJSONString: \(json?.jsonString() ?? "")")
      log.debug("SwifterSwift toJSONString: \(json?.jsonString(prettify: true) ?? "")")

      打印结果:

      - SwifterSwift toJSONString: {"promoted":0,"mobilePhone":"186****9319","userId":0}  
      - SwifterSwift toJSONString: {
          "promoted" : 0,
          "mobilePhone" : "186****9319",
          "userId" : 0
      }  
  • DictionaryJSONString

    • 直接用SwifterSwiftJSONString就可以了

      let json = ["key1": "value", "key2": "value2"]
      log.debug("SwifterSwift toJSONString: \(json.jsonString() ?? "")")
      log.debug("SwifterSwift toJSONString: \(json.jsonString(prettify: true) ?? "")")

      打印结果:

      - SwifterSwift toJSONString: {"promoted":0,"mobilePhone":"186****9319","userId":0}  
      - SwifterSwift toJSONString: {
      "key2" : "value2",
      "key1" : "value"
      } 

      打印结果:

      {
      "key2" : "value2",
      "key1" : "value1"
      }
    • SwiftyJSON

      let json = ["key1": "value", "key2": "value2"] as? [String: Any]
      print(JSON(json))

      这里将可选项用SwiftyJSON包装了一下再去打印就不会有转译符了

    • 利用NSString去转义符

      let dic = ["key1": "value1", "key2": "value2"]  
      let data = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted)  
      print(NSString(string: String(data: data, encoding: .utf8) ?? ""))  
    • Moya自带插件NetworkLoggerPlugin可以直接帮助我们打印网络相关的信息, 而且不包含转译符

以上的写法都能够满足日常的控制台输出查看, 可复制到其他格式解析工具中查看, 接下来专门对比下可选项值类型的打印结果

let json = ["key1": "value", "key2": "value2"] as? [String: Any]
print(["key1": "value", "key2": "value2"])
print(json?.jsonString())
print(json!.jsonString())
print(json?.jsonString() ?? "")
print("拼接: \(json?.jsonString())")
print("拼接: \(json!.jsonString())")
print("拼接: \(json?.jsonString() ?? "")")

输出结果

["key1": "value", "key2": "value2"]
Optional("{\"key1\":\"value\",\"key2\":\"value2\"}")
Optional("{\"key1\":\"value\",\"key2\":\"value2\"}")
{"key1":"value","key2":"value2"}
拼接: Optional("{\"key1\":\"value\",\"key2\":\"value2\"}")
拼接: Optional("{\"key1\":\"value\",\"key2\":\"value2\"}")
拼接: {"key1":"value","key2":"value2"}

通过对比输出结果可以观察到可选值在不同的解包打印后的效果

⚠️ **GitHub.com Fallback** ⚠️