Ошибки при попытке преобразовать тип [Any] в JSON с помощью Swift - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь преобразовать тип объекта [Any] в JSON или что-то, что я могу использовать для доступа к атрибутам.

Шаги:

  1. Я вызываю функцию из библиотеки для подключения к устройству Bluetooth и извлечения данных из его памяти:
device.getMemoryData(totalCount: { (count) in
       print("There are \(count) elements in the memory")
    }, dataArray: { (data) in
      print("DATA --> \(data)")
      self.processReceivedData(data)
      // Here is where I receive the [Any] object 
    })

Полученный объект, напечатанный на шаге 1, соответствует следующему:

[{
    side = 0;
    dataID = 07ebcd0070bf9a8116a8898e673e96e4;
    valueA = 69;
    valueC = 60;
    valueD = 0;
    irregular = 0;
    angleChange = 4;
    startAngle = 34;
    valueB = 106;
    time = "2015-01-01 13:33:00 +0000";
},
{
    side = 0;
    dataID = 0cf80347a86013689586d01d1d80fca5;
    valueA = 69;
    valueC = 60;
    valueD = 0;
    irregular = 0;
    angleChange = 2;
    startAngle = 37;
    valueB = 106;
    time = "2015-01-01 15:06:00 +0000";
}]
Попытайтесь получить доступ к информации, содержащейся в объекте:

Я пытаюсь с помощью JSONSerialization:

function processReceivedData(data:[Any]) {
  guard let processedData = try? JSONSerialization.data(withJSONObject: data, options: []) as? [[String: Any]] else {
      print("ERROR")
      return
    }
 print("JSON: \(processedData)")
// Run error when trying to serialize: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__NSTaggedDate)'
*** First throw call stack:
}

Я также пытаюсь выполнить итерацию по нему, используя следующую команду for но я получаю ошибку компиляции:

function processReceivedData(data:[Any]) {
 for item in data {
      for (id, object) in item {
        print("ID: \(id), Object: \(object)")
      }
    }
}
// Compile error: Type 'Any' does not conform to protocol 'Sequence'

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

1 Ответ

0 голосов
/ 18 февраля 2019

Как прокомментировано, ваш data является NSArray из NSDictionary.Вам не нужно конвертировать в JSON для доступа к атрибутам .

Попробуйте:

func processReceivedData(data:[Any]) {
    for item in data {
        if let item = item as? [String: Any] {
            for (id, object) in item {
                print("ID: \(id), Object: \(object)")
            }
        } else {
            print("Unexpected element: \(item)")
        }
    }
}
...