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"
我正在使用 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 useinit(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"