Пустое строковое значение SwiftyJSON

У меня проблема с разбором JSON в Swift. Я использую фреймворк SwiftyJSON.

Мои данные приходят из сети:

let dataString : NSString = NSString(data: data, encoding: NSUTF8StringEncoding)!;

печать этого:

println("Received data: \(dataString)")

дает мой JSON:

Received data: {"result":"success"}

Но когда я пытаюсь прочитать значение результата:

let json = JSON(dataString);
println(json["result"].stringValue); //<-- empty string

тогда вывод пустой. Я пробовал разные подходы, например:

println(json[1]["result"].stringValue); //<-- empty string
println(json["result"]); //<-- prints "null"

но пока ничего не получалось. Что я делаю не так?

Изменить: это на стороне сервера (Java):

    String response = client.isAuthenticated() ? "success" : "fail";
    client.send(new JSONObject().put("result", response).toString());

Для чтения данных я использую CocoaAsyncSocket:

func socket(sock: GCDAsyncSocket!, didReadData data: NSData!, withTag tag: Int)

Ошибка, которую я получаю:

Dictionary["result"] сбой, это не словарь

Edit2: я обнаружил, что проблема в данных:

let dataFromString = dataString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?

имеет длину 22 байта. Если я установлю

dataString : NSString = "{\"result\":\"success\"}"

и сделайте то же самое снова, его длина 20 байт. Мои данные имеют два байта 0x0014 в начале:

<7b227265 73756c74 223a2273 75636365 7373227d>  //<-- correct
<00147b22 72657375 6c74223a 22737563 63657373 227d> // <-- mine

Если я удалю два пока с помощью

dataFromString!.subdataWithRange(NSMakeRange(2, 20))

JSON может быть правильно проанализирован.

Edit3 (мое решение):

Проблема была в DataOutputStream, который я использовал в Java-Service. Он добавил два байта к моему JSON. Я заменил его на BufferedOutputStream, и теперь он работает как положено.


person Phil Phil    schedule 09.09.2015    source источник
comment
github.com/SwiftyJSON/SwiftyJSON#initialization: JSON() ожидает объект JSON, а не нить. Используйте JSON (данные:)   -  person Stefan    schedule 10.09.2015


Ответы (2)


Вы должны получить NSData из строки и инициализировать объект JSON с его помощью, вот пример:

let dataString : NSString = "{\"result\":\"success\"}"

if let dataFromString = dataString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) {
   let json = JSON(data: dataFromString)
    print(json["result"])
}

Подробнее: SwiftyJSON — инициализация

person Hatem Alimam    schedule 10.09.2015
comment
Хорошо, я узнал, что проблема в данных. Ваша строка данных содержит 20 байтов (как и ожидалось), тогда как моя содержит 22 байта. Я не знаю, откуда берутся эти лишние 2 байта. - person Phil Phil; 10.09.2015
comment
Я не уверен в этом, но я думаю, что 2 байта не окажут такого влияния, служба могла вернуться с дополнительными пробелами или чем-то еще, например, вы проверяли мои данные? - person Hatem Alimam; 10.09.2015
comment
Да, ваш пример работает. Я попытался удалить первые два байта из своих данных, и тогда мой код тоже работает. Байты 0x0014. Я отредактирую свой вопрос, чтобы решить эту проблему. - person Phil Phil; 10.09.2015

Вы должны построить JSON с init(data:) конструктором с NSData.

Пытаться:

let json = JSON(data: data)
person rintaro    schedule 10.09.2015