Swift - 驼峰与下划线JSON字符串(key)键名互转

扩展String方便转换获取Json数据时候的驼峰与下划线键名互转
extension String {
    
    private var camelName:String {
        var result = ""
        var flag = false
        self.forEach { c in
            let s = String(c)
            if s == "_" {
                flag = true
            } else {
                if flag {
                    result += s.uppercased()
                    flag = false
                } else {
                    result += s
                }
            }
        }
        return result
    }
    
    private var underscore_name:String {
        var result = ""
        self.forEach { c in
            let num = c.unicodeScalars.map { $0.value }.last!
            let s = String(c)
            if num > 64 && num < 91 {
                result += "_"
                result += s.lowercased()
            } else {
                result += s
            }
        }
        return result
    }
    
    enum JsonKeyType {
        case camel, underscore
    }
    
    func convertJsonKeyName(_ keyType: JsonKeyType) -> String {
        let pattern = "[\"' ]*[^:\"' ]*[\"' ]*:"
        var nsStr = self as NSString
        do {
            let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive)
            // TODO: - 优化
            var res = regex.matches(in: nsStr as String, options:[NSRegularExpression.MatchingOptions(rawValue: 0)], range: NSMakeRange(0, (nsStr as NSString).length)) // 获取总位置数目
            for i in 0..<res.count {
                // 获取新位置
                res = regex.matches(in: nsStr as String, options:[NSRegularExpression.MatchingOptions(rawValue: 0)], range: NSMakeRange(0, (nsStr as NSString).length)) //str.count
                let c = res[i]
                let cStr = (nsStr as NSString).substring(with: c.range)
                let newStr = keyType == .camel ? cStr.camelName : cStr.underscore_name
                nsStr = nsStr.replacingCharacters(in: c.range, with: newStr) as NSString
            }
            
        } catch {
            print(error)
        }
        return nsStr as String
    }
}
例子
    let cameljsonStr = """
    {
    "testData":[
    {
    "accountName":"Bill",
    "password":"12312312"
    },
    {
    "accountName":"George",
    "password":"123123"
    }
    ]
    }
    """
    print(cameljsonStr.convertJsonKeyName(.underscore))
    // res => underscorejsonStr

    let underscorejsonStr = """
    {
    "test_data":[
    {
    "account_name":"Bill",
    "password":"12312312"
    },
    {
    "account_name":"George",
    "password":"123123"
    }
    ]
    }
    """
    print(underscorejsonStr.convertJsonKeyName(.camel))
    // res => cameljsonStr
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,886评论 18 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,008评论 3 119
  • 她总是消耗我的能量,做销售要有激情,做企业要创造价值,这是昨天面试陈总给我讲的,道理我也明白,关键是要做到 宋姨说...
    张严阅读 455评论 0 0
  • 与几位好友闲聚,随意间就聊到两位的感情…早就听说老K又寻了新欢,老A也有了几年爱情长跑,作为铁三角的我甚...
    萌萌的谪仙儿阅读 375评论 0 0
  • 都说人生是一场赌局,堵上了所有的岁月,为了金钱权谋歇斯底里。而我们正值青春,尚显单纯的我们还未曾想到如此,我们堵上...
    冬日晚来秋阅读 655评论 0 2