2

我是SwiftyJSON的新手,我遇到了一些麻烦。我可以让它将整个 JSON 文件作为字符串返回,但是当我尝试解析它时,我不断得到空变量,我不确定我做错了什么。

这是我的 JSON 文件的格式:

[
    {
        "entryID": 1,
        "from": "String",
        "to": "String",
        "value": "String"
    },
    {
        ...
    },
    ...
]

这大致就是我想要用它做的(在非常不优雅的代码中,我道歉,我是 Swift 的新手):

for entry: JSON in indexJSON.arrayValue {

    var vEntryID: Int
    var vFrom: String
    var vTo: String
    var vValue: String
    for (dictKey: String, dictVal: JSON) in entry.dictionaryValue {
        if(dictKey=="entryID") {vEntryID = dictVal.intValue}
        if(dictKey=="from") {vFrom = dictVal.stringValue}
        if(dictKey=="to") {vTo = dictVal.stringValue}
        if(dictKey=="value") {vValue = dictVal.stringValue}
    }

    someSwiftObject[vEntryID]["from"] = vFrom
    someSwiftObject[vEntryID]["to"] = vTo
    someSwiftObject[vEntryID]["value"] = vValue
}

但是,此块根本不会执行,因为 indexJSON.arrayValue 始终为空。

当我尝试运行以下命令时,它会将完整的文件内容正确打印到控制台:

let indexJSON = JSON(content!)
println(indexJSON.stringValue)

但是当我尝试更深入地获取任何元素时,它什么也不返回:

if(indexJSON.arrayValue.isEmpty==true) {println("indexJSON.arrayValue is Empty")}
if(indexJSON[0].arrayValue.isEmpty==true) {println("indexJSON[0].arrayValue is Empty")}
if(indexJSON[0].dictionaryValue.isEmpty==true) {println("indexJSON[0].dictionaryValue is Empty")}
if(indexJSON[0]["entryID"]==nil) {println("indexJSON[0][\"entryID\"].stringValue is Empty")}

输出:

indexJSON.arrayValue is Empty
indexJSON[0].arrayValue is Empty
indexJSON[0].dictionaryValue is Empty
indexJSON[0]["entryID"].stringValue is Empty

我将不胜感激任何帮助!我究竟做错了什么?

4

3 回答 3

6

我检查了 SwiftyJSON 源代码,我想我知道问题出在哪里。

我想您正在使用 String 像这样初始化 JSON 对象

let s = "{\"entryID\": 1,\"from\": \"String\",\"to\": \"String\",\"value\": \"String\"}"
let j = JSON(s)

在这种情况下,JSON 对象实际上被赋予了“String”类型,而不是 Array。这就是为什么它不可迭代并且它的 arrayValue 是空的。

要做你想做的事,你需要用一个 Array 对象来初始化它:

let arr = [
        [
            "entryID":1,
            "from":"String",
            "to":"String",
            "value":"String",
        ]
]

let j2 = JSON(arr)

现在 j2 是一个数组 JSON 对象并且是可迭代的。

SwiftyJSON 只能用 NSData 和 object 来初始化。所以如果你想用一个字符串初始化它,你需要这样做:

if let data = s.dataUsingEncoding(NSUTF8StringEncoding) {
    let j = JSON(data:data)
    println(j)
}
于 2015-01-23T02:20:52.903 回答
1

首先,确保您的 json 字符串的格式正确。在您的问题中,您的 json 字符串是一个数组,只需像这样格式化字符串(内容来自我的代码):

let jsonStr = "[{\"name\": \"hangge\", \"age\": 100, \"phones\": [{\"name\": \"公司\",\"number\": \"123456\"}, {\"name\": \"家庭\",\"number\": \"001\"}]}, {\"name\": \"big boss\",\"age\": 1,\"phones\": [{ \"name\": \"公司\",\"number\": \"111111\"}]}]"

然后你可以使用 SwityJson 来获取数组对象,如下所示:

let strData = jsonStr.data(using: String.Encoding.utf8, allowLossyConversion: false)
let json = JSON(data: strData!)
for object in json.arrayValue {
    let name = object["name"].string
}
于 2017-03-14T08:37:11.870 回答
0

看看这里的文档:https ://github.com/lingoer/SwiftyJSON#loop

您正在错误地迭代它。您应该使用这样的 for 循环遍历数组:

for (index: String, subJson: JSON) in json {
    //Do something you want
}
于 2015-01-23T02:06:10.873 回答