首页 > 解决方案 > 如何在 Swift 中将键值对分解为 JSON 字符串?

问题描述

给定一个键值对,例如“abcd”=“e”,我怎样才能得到下面的 JSON 字符串:

{
  "a": {
    "b": {
      "c": {
        "d": "e"
      }
    }
  }
}

标签: iosswift

解决方案


您可以构建字典层次结构,然后将其转换为 JSON 字符串。

给定一个

  • 由点 ( .) 分隔的路径元素列表组成的键
  • 和一个值,

您可以按如下方式构建您的字典对象:

var jsonObject: [String: Any]

var path = key.split(separator: ".").map { String($0) }
let lastKey = path.popLast()!
jsonObject = [lastKey: value]

for element in path.reversed() {
    jsonObject = [element: jsonObject]
}

然后你可以得到一个漂亮的打印版本(如上面的例子),如下所示:

let jsonData = try! JSONSerialization.data(withJSONObject: jsonObject, options: [.prettyPrinted])
let encoded = String(data: jsonData, encoding: .utf8)!

要获得紧凑(非漂亮)版本,请省略该.prettyPrinted选项(但保留数组括号)。

let jsonData = try! JSONSerialization.data(withJSONObject: jsonObject, options: [])
let encoded = String(data: jsonData, encoding: .utf8)!

这是打包成一个函数的全部内容:

func jsonFromKeyValue(key: String, value: String) -> String {
    var jsonObject: [String: Any]

    var path = key.split(separator: ".").map { String($0) }
    let lastKey = path.popLast()!
    jsonObject = [lastKey: value]

    for element in path.reversed() {
        jsonObject = [element: jsonObject]
    }

    let jsonData = try! JSONSerialization.data(withJSONObject: jsonObject, options: [.prettyPrinted])
    let encoded = String(data: jsonData, encoding: .utf8)!

    return encoded
}

试试看:

let jsonObject = jsonFromKeyValue(key: "a.b.c.d", value: "e")
print(jsonObject)

推荐阅读