SwiftyJSON 不断返回空对象
SwiftyJSON keeps returning empty objects
我是 SwiftyJSON 的新手,遇到了一些问题。我可以将它作为一个字符串 return 整个 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)
但是当我尝试更深入地获取任何元素时,return什么都没有:
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
如有任何帮助,我将不胜感激!我做错了什么?
查看此处的文档:https://github.com/lingoer/SwiftyJSON#loop
您迭代错误。您应该像这样使用 for 循环遍历数组:
for (index: String, subJson: JSON) in json {
//Do something you want
}
我检查了 SwiftyJSON 源代码,我想我知道问题出在哪里了。
我想您正在使用 String 像这样初始化 JSON 对象
let s = "{\"entryID\": 1,\"from\": \"String\",\"to\": \"String\",\"value\": \"String\"}"
let j = JSON(s)
在这种情况下,JSON 对象实际上被赋予了类型 "String",而不是数组。这就是为什么它不可迭代且其 arrayValue 为空的原因。
要做你想做的事,你需要用一个数组对象来初始化它:
let arr = [
[
"entryID":1,
"from":"String",
"to":"String",
"value":"String",
]
]
let j2 = JSON(arr)
现在 j2 是一个数组 JSON 对象并且可迭代。
SwiftyJSON 只能用 NSData 和对象初始化。所以如果你想用字符串初始化它,你需要这样做:
if let data = s.dataUsingEncoding(NSUTF8StringEncoding) {
let j = JSON(data:data)
println(j)
}
首先,确保 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
}
我是 SwiftyJSON 的新手,遇到了一些问题。我可以将它作为一个字符串 return 整个 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)
但是当我尝试更深入地获取任何元素时,return什么都没有:
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
如有任何帮助,我将不胜感激!我做错了什么?
查看此处的文档:https://github.com/lingoer/SwiftyJSON#loop
您迭代错误。您应该像这样使用 for 循环遍历数组:
for (index: String, subJson: JSON) in json {
//Do something you want
}
我检查了 SwiftyJSON 源代码,我想我知道问题出在哪里了。
我想您正在使用 String 像这样初始化 JSON 对象
let s = "{\"entryID\": 1,\"from\": \"String\",\"to\": \"String\",\"value\": \"String\"}"
let j = JSON(s)
在这种情况下,JSON 对象实际上被赋予了类型 "String",而不是数组。这就是为什么它不可迭代且其 arrayValue 为空的原因。
要做你想做的事,你需要用一个数组对象来初始化它:
let arr = [
[
"entryID":1,
"from":"String",
"to":"String",
"value":"String",
]
]
let j2 = JSON(arr)
现在 j2 是一个数组 JSON 对象并且可迭代。
SwiftyJSON 只能用 NSData 和对象初始化。所以如果你想用字符串初始化它,你需要这样做:
if let data = s.dataUsingEncoding(NSUTF8StringEncoding) {
let j = JSON(data:data)
println(j)
}
首先,确保 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
}