Невозможно правильно извлечь данные из JSON в swift - PullRequest
0 голосов
/ 11 июля 2019

У меня есть такой тип объекта json в моем ответе после разбора строки json на объект

[
    "requestId": 1, 
    "response": {
        code = SUCCESS;
    }, 
    "messageId": ACTION_COMPLETE
]

Я пытаюсь извлечь requestId используя

responseMsg["requestId"] as! Int

Я получаю эту ошибку

Не удалось привести значение типа 'NSTaggedPointerString' (0x21877a910) к 'NSNumber' (0x218788588).

Я пытался изменить его на Int(responseMsg["requestId"] as! String)! Эта вещь работает для положительных чисел, но не для отрицательных чисел, вероятно, bcz, когда requestId = -2 выдает ошибку

Не удалось привести значение типа '__NSCFNumber' (0x21877a000) к 'NSString' (0x218788290).

Я тоже пытался с другим решением, но не сработало.

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

Для анализа данных JSON лучше использовать Codable вместо анализа всего вручную.

Для формата JSON ,

{
    "requestId": 1,
    "response": {
        "code":"SUCCESS"
    },
    "messageId": "ACTION_COMPLETE"
}

Создать Модели например,

struct Root: Decodable {
    let requestId: String?
    let messageId: String
    let response: Response

    enum CodingKeys: String, CodingKey {
        case requestId, messageId, response
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        if let id = try? values.decode(Int.self, forKey: .requestId) {
            requestId = String(id)
        } else if let id = try? values.decode(String.self, forKey: .requestId) {
            requestId = id
        } else {
            requestId = nil
        }
        messageId = try values.decode(String.self, forKey: .messageId)
        response = try values.decode(Response.self, forKey: .response)
    }
}

Теперь анализ данных JSON с использованием

do {
    let root = try JSONDecoder().decode(Root.self, from: data)
    print(root.requestId) //access requestId like this....
} catch {
    print(error)
}
0 голосов
/ 11 июля 2019

Это сообщение об ошибке

Could not cast value of type 'NSTaggedPointerString' (0x21877a910) to 'NSNumber' (0x218788588).

говорит нам, что идентификатор запроса JSON анализируется как строка. NSTaggedPointerString - это специальный внутренний тип, используемый средой выполнения ObjC для представления строк.

Попробуйте это:

let requestId = responseMsg["requestId"] as! String
print("request id: \(requestId)") // Prints a string

Обратите внимание, что он может напечатать что-то похожее на число, но это не так.

JSON, который вы анализируете, вероятно, выглядит как

{
    "requestId": "1", 
    "response": {
        "code" = "SUCCESS"
    }, 
    "messageId": "ACTION_COMPLETE"
}

Обратите внимание на 1 в кавычках.

0 голосов
/ 11 июля 2019

Попробуйте

Int(String(describing: responseMsg["requestId"]))!

Это гарантирует, что любые данные сначала преобразуются в строку, а затем в int

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...