微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在swift 5中将字符串转换为字典?

如何解决在swift 5中将字符串转换为字典?

我有一个包含以下格式的 json 的字符串:

var myString: String = "{key1: val1,key2: val2}"

如何将其转换为:

var myJson: [String: String] = ["key1": "val1","key2": "val2"]

由于我的字符串不是 "{"key1": "val1","key2": "val2"}" 格式,我在通过以下代码片段解析它时遇到了困难:

func convertToDictionary(text: String) -> [String: Any]? {
    if let data = text.data(using: .utf8) {
        do {
            return try JSONSerialization.jsonObject(with: data,options: []) as? [String: Any]
        } catch {
            print(error.localizedDescription)
        }
    }
    return nil
}

这个函数总是为 myString 返回 nil

解决方法

你可能不得不以艰难的方式去做。像这样:

import SwiftUI

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: .whitespacesAndNewlines)
    }
}

struct ContentView: View {
    var body: some View {
        Text("testing")
            .onAppear {
                let myString: String = "{key1: val1,key2: val2,key3: val3}"
                let myJson = transform(myString)
                print("----> myJson: \(myJson)")
            }
    }
    
    func transform(_ myString: String) -> [String : String] {
        var result = [String : String]()
        if myString.count > 2 { // case of {}
            let temp1 = myString.dropFirst().dropLast()
            let temp2 = temp1.split(separator: ",").map{String($0)}
            for str in temp2 {
                let temp3 = str.split(separator: ":").map{String($0)}
                let (k,v) = (temp3[0].trim(),temp3[1].trim())
                result[k] = v
            }
        }
        return result
    }
}
,

您知道应该引用键和值。这是一个简单的方法。

let jsonString = myString.replacingOccurrences(of: "(\\w+)",with: "\"$1\"",options: .regularExpression)

let result = convertToDictionary(text: jsonString)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。