SwiftyJSON продолжает возвращать пустые объекты

Я новичок в 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

Буду благодарен за любую помощь! Что я делаю не так?


person Quintus    schedule 23.01.2015    source источник
comment
Я разочарован Swifty, это не та чудодейственная вещь, которую рекламируют.   -  person Josh    schedule 14.05.2015


Ответы (3)


Я проверил исходный код 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 и объекта. Итак, если вы хотите инициализировать его строкой, вам нужно сделать это:

if let data = s.dataUsingEncoding(NSUTF8StringEncoding) {
    let j = JSON(data:data)
    println(j)
}
person skyline75489    schedule 23.01.2015
comment
Ага! Это кажется очень вероятным, я использую этот код для чтения JSON: let path = NSBundle.mainBundle().pathForResource("entries", ofType: "json"); let content = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil); let json = JSON(content!). Как мне загрузить файл как объект JSON таким образом, чтобы сделать его итерируемым? - person Quintus; 23.01.2015

Прежде всего, убедитесь, что формат вашей строки 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
}
person WilliamChik    schedule 14.03.2017

Взгляните на документацию здесь: https://github.com/lingoer/SwiftyJSON#loop

Вы повторяете это неправильно. Вы должны перебирать массив с помощью цикла for, подобного этому:

for (index: String, subJson: JSON) in json {
    //Do something you want
}
person tng    schedule 23.01.2015
comment
Хм. Это никогда не срабатывает для меня по какой-то причине. - person Quintus; 23.01.2015