【问题标题】:Json updating in swiftJson 快速更新
【发布时间】:2019-11-18 09:00:45
【问题描述】:

目标是将 innerJson 转换为 Array。这有什么错误?请帮忙

var outerJson:String? = "{\"outerkey1\":\"Air France\",\"innerJson\":\"[{\\\"innerJsonKey1\\\":\\\"1\\\",\\\"innerJsonKey2\\\":{\\\"businessPurpose\\\":\\\"Test\\\",\\\"description\\\":\\\"Testing \\\"}},{\\\"innerJsonKey1\\\":\\\"2\\\",\\\"innerJsonKey2\\\":{\\\"businessPurpose\\\":null,\\\"description\\\":null}}]\",\"AirClass\":\"null\",\"FromTo\":\"Utti (QVY)\\/Umea (UME)\"}"
var convertedDict:[String:Any]?
if let data = outerJson?.data(using: String.Encoding.utf8) {

    do {
        convertedDict = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any]
        //print(convertedDict)
    } catch {
        //CALogger.dPrint(error)
    }
}
//print(convertedDict?["innerJson"] as Any)
var array = convertedDict?["innerJson"] as? Array<[String:Any]>
print(array)

【问题讨论】:

  • @Pramod,试过了。没用。
  • 不相关但您可以删除整个options 参数。如果预期的类型是集合类型,那么这些选项在 Swift 中都不相关。
  • 您在 JSON 中将数组作为字符串

标签: ios json swift4.2


【解决方案1】:

请仔细阅读 JSON。键 innerJson 的值是(另一个 JSON)String,而不是数组。多行文字字符串语法使其更清晰。

你必须应用 JSONSerialization 两次

let outerJson = """
{"outerkey1":"Air France","innerJson":"[{\\"innerJsonKey1\\":\\"1\\",\\"innerJsonKey2\\":{\\"businessPurpose\\":\\"Test\\",\\"description\\":\\"Testing \\"}},{\\"innerJsonKey1\\":\\"2\\",\\"innerJsonKey2\\":{\\"businessPurpose\\":null,\\"description\\":null}}]","AirClass":"null","FromTo":"Utti (QVY)\\/Umea (UME)"}
"""


let data = Data(outerJson.utf8)
do {
    if let outerDict = try JSONSerialization.jsonObject(with: data) as? [String:Any],
        let innerJSON = outerDict["innerJson"] as? String {
        if let innerArray = try JSONSerialization.jsonObject(with: Data(innerJSON.utf8)) as? [[String:Any]] {
            print(innerArray)
        }
    }
} catch {
    //CALogger.dPrint(error)
}

【讨论】:

  • 在看到你的评论后已经在做同样的事情了。谢谢冠军@vadian
【解决方案2】:
var outerJson:String? = "{\"outerkey1\":\"Air France\",\"innerJson\":\"[{\\\"innerJsonKey1\\\":\\\"1\\\",\\\"innerJsonKey2\\\":{\\\"businessPurpose\\\":\\\"Test\\\",\\\"description\\\":\\\"Testing \\\"}},{\\\"innerJsonKey1\\\":\\\"2\\\",\\\"innerJsonKey2\\\":{\\\"businessPurpose\\\":null,\\\"description\\\":null}}]\",\"AirClass\":\"null\",\"FromTo\":\"Utti (QVY)\\/Umea (UME)\"}"

var convertedDict:[String:Any]?

if let data = outerJson?.data(using: String.Encoding.utf8) {

    do {
        convertedDict = try JSONSerialization.jsonObject(with: data, options: [.mutableContainers,.allowFragments,.mutableLeaves]) as? [String: Any]
        //print(convertedDict)
    } catch {
        //CALogger.dPrint(error)
    }
}

// Create a new array of type [<String, Any>] from the convertedDict dictionary 
let arrayOfDicts = convertedDict?.map { [$0.key: $0.value] }

print(arrayOfDicts)

【讨论】:

  • 转换后的 dict 是字典,我可以数组 ["innerJson"],但我想将数组 ["innerJson"] 转换为数组
  • @RamcharanReddy,我已经编辑了我的答案。如果这有帮助,请告诉我。
猜你喜欢
  • 2012-10-29
  • 2015-01-24
  • 2020-02-17
  • 1970-01-01
  • 2015-11-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
相关资源
最近更新 更多