Swifty Json 解析

Swifty Json parsing

我正在使用 SwiftyJson 库来解析我的关注 json

{
    "data": {
        "id": "12345",
        "messages": {
            "message": "{\"data\":{\"msg\":\"HelloMsg\"}}"
        }
    }
}

我尝试使用以下代码获取 msg 参数

let json = JSON(data)
let msg = JSON(json["data"]["messages"]["message"])
msg["data"]["msg"].stringValue

但是,我无法获取 msg 参数的值。怎么获取HelloMsg?

messaage是一个字符串。不是 JSON。所以 SwiftyJson 无法解析它。您必须首先解析该字符串,然后使用 JSONSerialization.jsonObject(with: Data, options: JSONSerialization.ReadingOptions).

从中获取消息

您可以参考这个答案从该字符串中获取字典:

您的第二个 "message" 键值是一个带有 JSON 格式字典的字符串,因此您需要将该字符串转换为 JSON 并访问 ["data" ]["msg"] 然后

代码

let json = JSON(data)
let msg = json["data"]["messages"]["message"]
let jsonFromString = JSON(data: msg.data(using: .utf8)!, options: JSONSerialization.ReadingOptions.allowFragments, error: nil)
debugPrint(jsonFromString["data"]["msg"])

输出

HelloMsg

错误发生是因为 JSON(...) 是错误的 API 从字符串初始化和解析 SwiftyJSON 对象。

您必须使用以下语法:

let json = JSON(data)
let msg = JSON(parseJSON: json["data"]["messages"]["message"].stringValue)
msg["data"]["msg"].stringValue

来自 init(_ object: Any) 的文档:

note: this does not parse a String into JSON, instead use init(parseJSON: String)


编辑:

在 Playground 中测试代码

let str = """
{"data": {"id": "12345",
            "messages": {
            "message": "{\"data\":{\"msg\":\"HelloMsg\"}}"
        }
    }
}
"""

let data = Data(str.utf8)
let json = JSON(data)
let msg = JSON(parseJSON: json["data"]["messages"]["message"].stringValue)
msg["data"]["msg"].stringValue

作为传统文字串的JSON是

let str = "{\"data\": {\"id\": \"12345\",\"messages\": {\"message\": \"{\\"data\\":{\\"msg\\":\\"HelloMsg\\"}}\"}}}"

"message"字段的内容没有被解析JSON,它是一个JSON字符串.

使用 SwiftyJSON 的 JSON(parseJSON:) 初始化器接受字符串作为输入并将其解析为 JSON:

let messages = json["data"]["messages"]["message"].stringValue
let innerJSON = JSON(parseJSON: messages)
let msg = innerJSON["data"]["msg"].stringValue // "HelloMsg"