【问题标题】:Swifty Json parsingSwifty Json 解析
【发布时间】:2018-07-27 11:15:30
【问题描述】:

我正在使用 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?

【问题讨论】:

  • “message”的值是多少(在“messages”中)。你明白了吗?只有“味精”有问题?
  • 实际上,message 中的所有值都是有问题的,现在我得到了答案并且它起作用了。

标签: ios json swift swifty-json nsjsonserialization


【解决方案1】:

"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"

【讨论】:

    【解决方案2】:

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

    你必须使用这个语法:

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

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

    注意:这不会将 String 解析为 JSON,而是使用 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\\\"}}\"}}}"
    

    【讨论】:

    • 哈哈这次我决定回答是因为我没有看到你的答案,因为我通常会先看到你的答案,所以我通常不需要这样做......但现在就在这里!啊哈:D
    • 如果我使用let msg : String = "{\"data\":{\"msg\":\"HelloMsg\"}}" let jsonFromString = JSON(parseJSON:msg) debugPrint(jsonFromString["data"]["msg"].stringValue),我将“”打印出来
    • @ReinierMelian 我已经做出了与 vadian 相同的解决方案,它有效。我什至在 Playground 中测试了将 OP 的确切源文本粘贴到文件中。
    • @Moritz 是的,但是我做错了什么?,我正在努力学习
    • @ReinierMelian 不知道。这是我的测试截图:imgur.com/bALDRQY
    【解决方案3】:

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

    您可以参考此答案以从该字符串中获取字典:https://stackoverflow.com/a/30480777/7820107

    【讨论】:

      【解决方案4】:

      您的第二个“消息”键值是一个带有 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        相关资源
        最近更新 更多