Swift: не удалось преобразовать NSCFString в NSNumber при разборе JSON

#json #swift #parsing #swift3

#json #swift #синтаксический анализ #swift3

Вопрос:

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

 {"ticker":{"base":"NLG","target":"USD","price":"0.05896390","volume":"","change":"-0.00044477"},"timestamp":1477232372,"success":true,"error":""}
  

Моя цель — получить цену в виде значения с плавающей точкой. Я могу извлечь json и записать его, когда он не преобразуется в значение с плавающей точкой, которое он печатает: Необязательно (0.05896390).

Когда я преобразую его в значение с плавающей точкой, я получаю предупреждение:

не удалось преобразовать значение типа NSCFString в NSNumber

  let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String: AnyObject]
 let tick = json["ticker"]!["price"]! as! Float
 print(tick)
  

Ответ №1:

price очевидно, что это строка. В объекте JSON все, что заключено в двойные кавычки, является строкой, даже если кажется, что это число.

 if let tick = json["ticker"] as? [String:Any], let price = tick["price"] as? String {
    print(Float(tick))
}
  

Поскольку все значения являются String , вы даже можете преобразовать словарь в более конкретный [String:String]

 if let tick = json["ticker"] as? [String:String], let price = tick["price"] {
    print(Float(tick))
}
  

Примечания:

  • Поскольку вам в любом случае приходится разворачивать опции, делайте это безопасно с помощью необязательных привязок.
  • В Swift 3 словарь JSON равен [String:Any]

Комментарии:

1. Кстати, это цена, поэтому рекомендуется использовать NSDecimalNumber вместо Float .