使用SwitfyJSON访问JSON属性将返回一个空字符串

时间:2015-05-14 10:25:55

标签: ios json xcode swift swifty-json

我正在尝试使用XCode上的SwiftyJSON从JSON打印属性(显然使用Swift语言)

我的第一行打印得很好,但第二行打印没有,我在在线解析器中检查了第一个println()的输出,并且striing是一致的:

var jdata = JSON(self.serverResponse)
println("jdata RAW: "+jdata.stringValue)
println("jdata.responseData: "+jdata["responseData"].stringValue)

这是打印这两件事的结果,你可以看到第二件只是空白:

jdata RAW: 
{
    "responseData": {
        "emotion":"",
        "lastinput":"What is your favourite color",
        "answer":"My favourite color is orange. What is yours?",
        "link": {
            "href":"",
            "target":""
        },
        "extraData": {
            "action":{"name":"displayClickableList","values":[{"label":"green","key":"1"},{"label":"yellow","key":"2"},{"label":"red","key":"3"}]},"type":"list"
        },
        "responseSession": {
            "id":"1ebfcd96c3c1f206dfb4087bc553",
            "transaction":"2"
        },
        "responseDetails": null,
        "responseStatus": 200,
        "applicationUrl": "http://moto-dev.cloud.com:88/moto-va-1/;jsessionid=1ebfc206dfb4087bc553"
    }
}


jdata.responseData: 

我是Swift的新手,这里出了什么问题?

2 个答案:

答案 0 :(得分:0)

您的属性似乎是字典,无法转换为字符串值。

但你可以像这样简单地打印出来:

println("jdata.responseData: \(jdata["responseData"])")

答案 1 :(得分:0)

好的,我找到了一种获取嵌套"动作"的内容的方法。属性。似乎Swifty无法打印jdata [" responseData"]因为它不是一个字符串(它是一个包含更多内容的字典),它也无法将其转换为字符串。 对我有用的方法是通过JSONS的不同层访问我想要的最终属性,然后 - 然后处理它。 例如:

var jdata = JSON(data: data!)
var jaction=jdata["responseData"]["extraData"]["action"]
println("jaction")
println(jaction.stringValue)

将返回此:

jaction
%7B%22name%22%3A%22displayClickableList%22%2C%22values%22%3A%5B%7B%22label%22%3A%22green%22%2C%22key%22%3A%221%22%7D%2C%7B%22label%22%3A%22yellow%22%2C%22key%22%3A%222%22%7D%2C%7B%22label%22%3A%22red%22%2C%22key%22%3A%223%22%7D%5D%7D

只有这样,因为没有更多的JSON嵌套,我可以使用那个奇怪的字符串并对其进行URL编码。 打印类似(或其间的任何内容):

println(jaction=jdata["responseData"].stringValue) //returns nothing!
println(jaction=jdata["responseData"]["extraData"].stringValue) //returns nothing!

将不返回任何内容,因为内容是Dictionary,而不是字符串。 这不是一个直观的行为,我不得不花费整个上午努力了解它的工作方式,在Android中我以另一种方式做到这一点。