Nano Hash - криптовалюты, майнинг, программирование

Использование данных внутри AnyObject Swift 2.0

У меня есть код, который берет данные JSON из веб-файла php, данные переходят в data var с использованием contentOfUrl, а затем преобразуются в jsonarray var с типом AnyObject с использованием NSJSONSerialization.JSONObjectWithData.

но проблема в том, что когда я хочу использовать его из jsonarray var, я искал два дня, и я нашел один, но не работал, потому что его структура var AnyObject отличается.

так как я могу его использовать?

Код:

    import Foundation

class DBConnectController{

    func ViewControllerConnect(DeviceID : Int) -> String{

        let data : NSData = NSData(contentsOfURL : NSURL(string: "http://xx.com/xc.php")!)!

        var jsonarray : AnyObject
        do {
            jsonarray = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)

            print(jsonarray["2"]) // tried this but didn't work
            print(jsonarray["2"].value) // tried this but didn't work
            // and tried other

        } catch {
            print("Error decoding json using NSJSONSerialization.JSONObjectWithData")
        }

        return "f"
    }
}

jsonarray (отображается при создании точки останова перед return:

04.08.2015

Ответы:


1

У вас есть массив объектов словаря. (Кстати, я использую Xcode 6/Swift 1.2, поэтому вам может не понадобиться параметр «err».)

(Кстати, ваш массив, похоже, имеет только один элемент, поэтому проверьте: myStructuredData.count перед его переполнением.)

func viewControllerConnect(deviceID: Int) -> String? {
    var err: NSError?
    var retVal: String?
    if let url = NSURL(string: "http://xx.com/xc.php"),
        data = NSData(contentsOfURL: url), // BAD You're doing long-running network task in UI thread, address this soon
        jsonData: AnyObject = NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments, error: &err) {
            if let myStructuredData = jsonData as? [[String: AnyObject]] { // You have an array of dictionaries there
                retVal = myStructuredData[0]["status"] as? String // For example, not sure of your exact needs & conventions
            }
            else {
                println("JSON data had unexpected structure: \(err?.localizedDescription)")
            }
        }
        else {
            println("Could not load JSON data")
        }
    return retVal
}
04.08.2015
  • фатальная ошибка: индекс массива вне диапазона, я не понял, что вы сказали о том, что в моем массиве есть один элемент, у меня есть 3 вары, исходящие из json, один из них - статус. и спасибо, что помните меня, чтобы использовать другие угрозы при получении сетевых данных 04.08.2015
  • У вас есть ОДИН элемент массива. Этот элемент массива не является ПРИМИТИВНЫМ ЗНАЧЕНИЕМ, а представляет собой целый словарь. И в этом словаре есть три КЛЮЧЕВЫЕ ПАРЫ. С новым кодом используйте точку останова, чтобы исследовать только что сформированный myStucturedData, чтобы найти, что извлекать. Вы можете назначить временную переменную для myStructuredData[0], чтобы упростить задачу. Я недостаточно знаю об этом. Вы не расширили первый и второй ключи. 04.08.2015
  • работал с изменением с deviceid -> 0, потому что, как вы сказали, у меня есть 1 элемент, содержащий (0,1,2) 3 vars, этот элемент равен 0 :) танков много 04.08.2015
  • Я был бы обеспокоен тем, что ваш входной параметр deviceID больше не используется. Зависит от того, на какой стадии развития вы находитесь. 04.08.2015
  • да, это все еще впереди, я кое-что изменю в вашем ответе, так что это сработало с людьми, использующими Swift 2, как заголовок Q 04.08.2015

  • 2

    Исполнение ответа Swift 2 выглядит следующим образом:

    let task = NSURLSession.sharedSession().dataTaskWithURL(url) { data, response, error in
        guard data != nil else {
            print("dataTaskWithURL error: \(error)")
            return
        }
    
        do {
            if let jsonarray = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [[String: AnyObject]],
                let status = jsonarray.first?["status"] as? String {
                    // use `status` here
                    print(status)
            }
        } catch {
            print("Error decoding json using NSJSONSerialization.JSONObjectWithData: \(error)")
        }
    }
    task.resume()
    

    Этот:

    • Использует асинхронный запрос, а не синхронный NSData(contentsOfURL:) ... никогда не используйте синхронные сетевые вызовы из основного потока приложения;

    • Защищает от сетевых ошибок (вместо принудительной распаковки с помощью !, которая приведет к сбою, если произойдет какая-то непредотвратимая сетевая ошибка);

    • Изящно разворачивайте jsonarray и status, а не принудительно;

    • Зарегистрируйте ошибку синтаксического анализа JSON, если таковая имеется; а также

    • Используйте .first с необязательной цепочкой, а не [0], потому что последний может дать сбой, если вы получите пустой массив и в конечном итоге превысите границы массива.

    04.08.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..