У меня есть файл JSON, я хочу проанализировать и использовать список объектов в виде таблицы. Может ли кто-нибудь поделиться кодом для быстрого анализа файла JSON.
Проблема с этим подходом заключается в том, что в итоге вы получаете кучу фундаментальных объектов. А именно NSString, NSNumber, NSArray, NSDictionary или NSNull. Что создает чертовски тяжелое бремя, если вы хотите иметь дело с собственным Swift, введенным позже в вашем коде. Особенно, если у вас есть вложенные словари и массивы. Кто-нибудь знает, как с этим бороться?
@bubakazouba: Жаль, что я не могу проголосовать против комментария. Пара вещей: 1. Кэролайн уже предоставила фрагмент для загрузки данных из файла (это то, что хотел OP). 2. В вашем коде используется кодировка ASCII, в которой теряются все символы Юникода, включая поддержку неанглоязычных языков.
akashivskyy
43
Выполнение запроса API
var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
Подготовка к ответу
Объявите массив, как показано ниже
var data: NSMutableData = NSMutableData()
Получение ответа
1.
funcconnection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
// Received a new request, clear out the data objectself.data = NSMutableData()
}
2.
funcconnection(connection: NSURLConnection!, didReceiveData data: NSData!) {
// Append the received chunk of data to our data objectself.data.appendData(data)
}
3.
funcconnectionDidFinishLoading(connection: NSURLConnection!) {
// Request complete, self.data should now hold the resulting info// Convert the retrieved data in to an object through JSON deserializationvar err: NSErrorvar jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) asNSDictionaryif jsonResult.count>0 && jsonResult["results"].count>0 {
var results: NSArray = jsonResult["results"] asNSArrayself.tableData = results
self.appsTableView.reloadData()
}
}
Когда мы NSURLConnectionполучаем ответ, мы можем ожидать, что didReceiveResponseметод будет вызван от нашего имени. На этом этапе мы просто сбрасываем наши данные, говоряself.data = NSMutableData() , создав новый пустой объект данных.
После установления соединения мы начнем получать данные в методе didReceiveData . Передаваемый здесь аргумент данных является источником всей нашей интересной информации. Нам нужно удерживать каждый входящий фрагмент, поэтому мы добавляем его к объекту self.data, который мы очистили ранее.
Наконец, когда соединение установлено и все данные получены, connectionDidFinishLoadingвызывается, и мы готовы использовать данные в нашем приложении. Ура!
Здесь connectionDidFinishLoadingметод использует NSJSONSerializationкласс для преобразования наших необработанных данных в полезные Dictionaryобъекты путем десериализации результатов из вашего URL-адреса.
Вопрос относительно вашего репозитория на Github: как вы на самом деле выполняете main.swift? У меня возникли проблемы с выполнением его из игровой площадки, поскольку вы, похоже, не можете ссылаться на классы, определенные в вашем собственном проекте, с игровой площадки (?!) Спасибо!
Янош
Я пометил методы как общедоступные в последнем репо. Это минимальное требование для Beta4, поэтому не забудьте обновить Xcode перед попыткой
dankogai
Хорошо, спасибо, я действительно искал, как именно выполнить пример кода. Я попробовал playgroung, но это не сработало, так как я не смог сослаться на класс JSON (это известная проблема, которую вы не можете ссылаться на классы в своем проекте)
Янош
Я не могу заставить его работать :( На этот раз я не пытаюсь использовать его на игровой площадке, я добавил ваш json.swift в свой проект, а в другом классе я пытаюсь его использовать. Это не работает. Я попробовал самый простой JSON: {"id": "Janos"}, создал объект JSON, вызвал его метод toString, он правильно выплевывает содержимое файла, однако, когда я вызываю myJson ["id"]. AsString, я получаю ноль. Что мне не хватает?
Янош
Я пытался создать объект JSON, передавая String в конструкторе ... Я изменил то, как вы это делаете в примере, теперь он работает. Вопрос только в том, какой из них использовать сейчас, ваш или SwiftyJSon :)
Янош
4
Вот код для преобразования между JSON и NSData в Swift 2.0.
// Convert from NSData to json objectfuncnsdataToJSON(data: NSData) -> AnyObject? {
do {
returntryNSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
} catchlet myJSONError {
print(myJSONError)
}
returnnil
}
// Convert from JSON to nsdatafuncjsonToNSData(json: AnyObject) -> NSData?{
do {
returntryNSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted)
} catchlet myJSONError {
print(myJSONError)
}
returnnil;
}
В Swift 4+ настоятельно рекомендуется использовать CodableвместоJSONSerialization .
Сюда Codableвходят два протокола: Decodableи Encodable. Этот Decodableпротокол позволяет декодироватьData в формате JSON настраиваемую структуру / класс, соответствующий этому протоколу.
Например, представьте себе ситуацию, когда у нас есть этот простой Data(массив из двух объектов)
let data = Data("""
[
{"name":"Steve","age":56},
{"name":"iPhone","age":11}
]
""".utf8)
затем следуйте structи реализуйте протоколDecodable
structPerson: Decodable{
let name: Stringlet age: Int
}
теперь вы можете декодировать свой Dataмассив Personиспользования, JSONDecoderгде первый параметр соответствует типу, Decodableи этот тип должен Dataбыть декодирован
do {
let people = tryJSONDecoder().decode([Person].self, from: data)
} catch { print(error) }
... обратите внимание, что декодирование должно быть помечено tryключевым словом, поскольку вы можете, например, сделать некоторую ошибку с именованием, и тогда ваша модель не может быть правильно декодирована ... поэтому вы должны поместить ее в блок do-try-catch
Случаи, когда ключ в json отличается от имени свойства:
Если ключ в имени , используя snake_case, вы можете установить декодер keyDecodingStrategyна convertFromSnakeCaseкоторый меняет ключ от property_nameдо верблюжьегоpropertyName
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let people = try decoder.decode([Person].self, from: data)
Если вам нужно уникальное имя, вы можете использовать ключи кодирования внутри структуры / класса, где вы объявляете имя ключа
let data = Data("""
{ "userName":"Codable", "age": 1 }
""".utf8)
structPerson: Decodable{
let name: Stringlet age: IntenumCodingKeys: String, CodingKey{
case name = "userName"case age
}
}
Я также написал небольшую библиотеку, которая специализируется на отображении ответа json в структуру объекта. Я внутренне использую библиотеку json-swift от Дэвида Оуэнса. Может быть, это кому-то пригодится.
Затем, чтобы фактически сопоставить объекты из ответа JSON, вам нужно только передать данные в класс EmployeeContainer как параметр в конструкторе. Он автоматически создает вашу модель данных.
var baseWebservice:BaseWebservice = BaseWebservice();
var urlToJSON = "http://prine.ch/employees.json"var callbackJSON = {(status:Int, employeeContainer:EmployeeContainer) -> () infor employee in employeeContainer.employees {
println("Firstname: \(employee.firstname) Lastname: \(employee.lastname) age: \(employee.age)")
}
}
baseWebservice.get(urlToJSON, callback:callbackJSON)
Консольный вывод выглядит следующим образом:
Firstname: JohnLastname: Doe age: 26Firstname: AnnaLastname: Smith age: 30Firstname: PeterLastname: Jones age: 45
Простите мое незнание. Каковы преимущества использования вашей библиотеки перед такой, как SwiftyJSON?
Леви Робертс,
6
Изначально я построил это, потому что мне не нравилась идея взлома операторов / символов языка. Кроме того, я создал его, чтобы познакомиться со Swift. Из любопытства я провел тест и обнаружил, что SwiftyJSON имеет превосходную скорость (примерно в 2-7 раз быстрее). Я обновил README репо, чтобы признать это.
Майк Рападас
Спасибо за Ваш ответ.
Леви Робертс
Можете ли вы показать пример того, как вы загрузите массив данных из JSON (несколько элементов, по сути, с циклом и т. Д.)
Вы предоставляете образец объекта JSON с именем класса, и инструмент сгенерирует соответствующий класс Swift, а также любые необходимые вспомогательные классы Swift для представления структуры, подразумеваемой образцом JSON. Также включены методы класса, используемые для заполнения объектов Swift, в том числе тот, который использует метод NSJSONSerialization.JSONObjectWithData. Предоставляются необходимые сопоставления из объектов NSArray и NSDictionary.
Из сгенерированного кода вам нужно только предоставить объект NSData, содержащий JSON, который соответствует образцу, предоставленному инструменту.
Извините за это, я вставлял URL-адрес JSON напрямую, он хорошо работает, вставляя ответ JSON. Было бы здорово, если бы URL вставлялся напрямую. Но блестящая работа для этой утилиты. Благодарю.
ioopl
Созданный вами инструмент просто великолепен. Я использую этот инструмент последние 6 месяцев. Но внезапно, поскольку последние 3 дня ваш веб-сайт недоступен, и браузер отвечает этим сообщением «Этот сайт недоступен». Итак, в чем причина этого?
Ответы:
Не может быть проще:
import Foundation let jsonData: Data = /* get your json data */ let jsonDict = try JSONSerialization.jsonObject(with: jsonData) as? NSDictionary
При этом я настоятельно рекомендую использовать Codable API, представленные в Swift 4.
источник
let jsonData = NSData.dataWithContentsOfFile(filepath, options: .DataReadingMappedIfSafe, error: nil)
NSData(contentsOfFile: path)
. См. Developer.apple.com/library/ios/documentation/Cocoa/Reference/… :Выполнение запроса API
var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
Подготовка к ответу
Объявите массив, как показано ниже
var data: NSMutableData = NSMutableData()
Получение ответа
1.
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) { // Received a new request, clear out the data object self.data = NSMutableData() }
2.
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) { // Append the received chunk of data to our data object self.data.appendData(data) }
3.
func connectionDidFinishLoading(connection: NSURLConnection!) { // Request complete, self.data should now hold the resulting info // Convert the retrieved data in to an object through JSON deserialization var err: NSError var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary if jsonResult.count>0 && jsonResult["results"].count>0 { var results: NSArray = jsonResult["results"] as NSArray self.tableData = results self.appsTableView.reloadData() } }
Когда мы
NSURLConnection
получаем ответ, мы можем ожидать, чтоdidReceiveResponse
метод будет вызван от нашего имени. На этом этапе мы просто сбрасываем наши данные, говоряself.data = NSMutableData()
, создав новый пустой объект данных.После установления соединения мы начнем получать данные в методе
didReceiveData
. Передаваемый здесь аргумент данных является источником всей нашей интересной информации. Нам нужно удерживать каждый входящий фрагмент, поэтому мы добавляем его к объекту self.data, который мы очистили ранее.Наконец, когда соединение установлено и все данные получены,
connectionDidFinishLoading
вызывается, и мы готовы использовать данные в нашем приложении. Ура!Здесь
connectionDidFinishLoading
метод используетNSJSONSerialization
класс для преобразования наших необработанных данных в полезныеDictionary
объекты путем десериализации результатов из вашего URL-адреса.источник
Я только что написал класс JSON, который делает обработку JSON в Swift такой же простой, как объект JSON в ES5.
Превратите ваш быстрый объект в JSON так:
let obj:[String:AnyObject] = [ "array": [JSON.null, false, 0, "",[],[:]], "object":[ "null": JSON.null, "bool": true, "int": 42, "double": 3.141592653589793, "string": "a α\t弾\n𪚲", "array": [], "object": [:] ], "url":"http://blog.livedoor.com/dankogai/" ] let json = JSON(obj) json.toString()
... или строка ...
let json = JSON.parse("{\"array\":[...}")
... или URL.
let json = JSON.fromURL("http://api.dan.co.jp/jsonenv") Tree Traversal
Просто перемещайтесь по элементам через нижний индекс:
json["object"]["null"].asNull // NSNull() // ... json["object"]["string"].asString // "a α\t弾\n𪚲" json["array"][0].asNull // NSNull() json["array"][1].asBool // false // ...
Как и в случае с SwiftyJSON, вы не беспокойтесь, если запись с индексом не существует.
if let b = json["noexistent"][1234567890]["entry"].asBool { // .... } else { let e = json["noexistent"][1234567890]["entry"].asError println(e) }
Если вы устали от индексов, добавьте свою схему так:
//// schema by subclassing class MyJSON : JSON { init(_ obj:AnyObject){ super.init(obj) } init(_ json:JSON) { super.init(json) } var null :NSNull? { return self["null"].asNull } var bool :Bool? { return self["bool"].asBool } var int :Int? { return self["int"].asInt } var double:Double? { return self["double"].asDouble } var string:String? { return self["string"].asString } }
И вы идете:
let myjson = MyJSON(obj) myjson.object.null myjson.object.bool myjson.object.int myjson.object.double myjson.object.string // ...
Надеюсь, тебе понравится.
С новым xCode 7.3+ важно добавить ваш домен в список исключений ( как я могу добавить NSAppTransportSecurity в мой файл info.plist? ), Обратитесь к этому сообщению для получения инструкций, иначе вы получите ошибку транспортного сервера.
источник
Вот код для преобразования между JSON и NSData в Swift 2.0.
// Convert from NSData to json object func nsdataToJSON(data: NSData) -> AnyObject? { do { return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) } catch let myJSONError { print(myJSONError) } return nil } // Convert from JSON to nsdata func jsonToNSData(json: AnyObject) -> NSData?{ do { return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted) } catch let myJSONError { print(myJSONError) } return nil; }
источник
Кодируемый
В Swift 4+ настоятельно рекомендуется использовать
Codable
вместоJSONSerialization
.Сюда
Codable
входят два протокола:Decodable
иEncodable
. ЭтотDecodable
протокол позволяет декодироватьData
в формате JSON настраиваемую структуру / класс, соответствующий этому протоколу.Например, представьте себе ситуацию, когда у нас есть этот простой
Data
(массив из двух объектов)let data = Data(""" [ {"name":"Steve","age":56}, {"name":"iPhone","age":11} ] """.utf8)
затем следуйте
struct
и реализуйте протоколDecodable
struct Person: Decodable { let name: String let age: Int }
теперь вы можете декодировать свой
Data
массивPerson
использования,JSONDecoder
где первый параметр соответствует типу,Decodable
и этот тип долженData
быть декодированdo { let people = try JSONDecoder().decode([Person].self, from: data) } catch { print(error) }
... обратите внимание, что декодирование должно быть помечено
try
ключевым словом, поскольку вы можете, например, сделать некоторую ошибку с именованием, и тогда ваша модель не может быть правильно декодирована ... поэтому вы должны поместить ее в блок do-try-catchСлучаи, когда ключ в json отличается от имени свойства:
Если ключ в имени , используя snake_case, вы можете установить декодер
keyDecodingStrategy
наconvertFromSnakeCase
который меняет ключ отproperty_name
до верблюжьегоpropertyName
let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase let people = try decoder.decode([Person].self, from: data)
Если вам нужно уникальное имя, вы можете использовать ключи кодирования внутри структуры / класса, где вы объявляете имя ключа
let data = Data(""" { "userName":"Codable", "age": 1 } """.utf8) struct Person: Decodable { let name: String let age: Int enum CodingKeys: String, CodingKey { case name = "userName" case age } }
источник
Я также написал небольшую библиотеку, которая специализируется на отображении ответа json в структуру объекта. Я внутренне использую библиотеку json-swift от Дэвида Оуэнса. Может быть, это кому-то пригодится.
https://github.com/prine/ROJSONParser
Пример Employees.json
{ "employees": [ { "firstName": "John", "lastName": "Doe", "age": 26 }, { "firstName": "Anna", "lastName": "Smith", "age": 30 }, { "firstName": "Peter", "lastName": "Jones", "age": 45 }] }
Следующим шагом вам нужно создать свою модель данных (EmplyoeeContainer и Employee).
Employee.swift
class Employee : ROJSONObject { required init() { super.init(); } required init(jsonData:AnyObject) { super.init(jsonData: jsonData) } var firstname:String { return Value<String>.get(self, key: "firstName") } var lastname:String { return Value<String>.get(self, key: "lastName") } var age:Int { return Value<Int>.get(self, key: "age") } }
EmployeeContainer.swift
class EmployeeContainer : ROJSONObject { required init() { super.init(); } required init(jsonData:AnyObject) { super.init(jsonData: jsonData) } lazy var employees:[Employee] = { return Value<[Employee]>.getArray(self, key: "employees") as [Employee] }() }
Затем, чтобы фактически сопоставить объекты из ответа JSON, вам нужно только передать данные в класс EmployeeContainer как параметр в конструкторе. Он автоматически создает вашу модель данных.
var baseWebservice:BaseWebservice = BaseWebservice(); var urlToJSON = "http://prine.ch/employees.json" var callbackJSON = {(status:Int, employeeContainer:EmployeeContainer) -> () in for employee in employeeContainer.employees { println("Firstname: \(employee.firstname) Lastname: \(employee.lastname) age: \(employee.age)") } } baseWebservice.get(urlToJSON, callback:callbackJSON)
Консольный вывод выглядит следующим образом:
Firstname: John Lastname: Doe age: 26 Firstname: Anna Lastname: Smith age: 30 Firstname: Peter Lastname: Jones age: 45
источник
SwiftJSONParse : анализируйте JSON как крутой
Очень просто и легко читается!
Пример: получить значение
"mrap"
изnicknames
в виде строки из этого ответа JSON{ "other": { "nicknames": ["mrap", "Mikee"] }
Он принимает ваши данные json
NSData
как есть, без предварительной обработки.let parser = JSONParser(jsonData) if let handle = parser.getString("other.nicknames[0]") { // that's it! }
Отказ от ответственности: я сделал это и надеюсь, что это поможет всем. Не стесняйтесь улучшать его!
источник
Парсинг JSON в Swift - отличная работа для генерации кода. Я создал инструмент на http://www.guideluxe.com/JsonToSwift для этого.
Вы предоставляете образец объекта JSON с именем класса, и инструмент сгенерирует соответствующий класс Swift, а также любые необходимые вспомогательные классы Swift для представления структуры, подразумеваемой образцом JSON. Также включены методы класса, используемые для заполнения объектов Swift, в том числе тот, который использует метод NSJSONSerialization.JSONObjectWithData. Предоставляются необходимые сопоставления из объектов NSArray и NSDictionary.
Из сгенерированного кода вам нужно только предоставить объект NSData, содержащий JSON, который соответствует образцу, предоставленному инструменту.
Кроме Foundation, зависимостей нет.
Моя работа была вдохновлена http://json2csharp.com/ , что очень удобно для проектов .NET.
Вот как создать объект NSData из файла JSON.
let fileUrl: NSURL = NSBundle.mainBundle().URLForResource("JsonFile", withExtension: "json")! let jsonData: NSData = NSData(contentsOfURL: fileUrl)!
источник
Примечание: если вы ищете это, также велика вероятность, что вы не знаете, как установить
swifty
. Следуйте инструкциям здесь .sudo gem install cocoapods cd ~/Path/To/Folder/Containing/ShowTracker
Затем введите эту команду:
pod init
Это создаст значение
Podfile
по умолчанию для вашего проекта. ЗдесьPodfile
вы определяете зависимости, от которых зависит ваш проект.Введите эту команду, чтобы открыть и
Podfile
использоватьXcode
для редактирования:open -a Xcode Podfile
Добавьте
Swifty
в подфайлplatform :ios, '8.0' use_frameworks! target 'MyApp' do pod 'SwiftyJSON', '~> X.X.X' end
var mURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&units=metric") if mURL == nil{ println("You are stupid") return } var request = NSURLRequest(URL: mURL!) NSURLConnection.sendAsynchronousRequest( request, queue: NSOperationQueue.mainQueue(), completionHandler:{ ( response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in if data != nil { var mJSON = JSON(data: data!) if let current_conditions = mJSON["weather"][0]["description"].string { println("Current conditions: " + current_conditions) } else { println("MORON!") } if let current_temperature = mJSON["main"]["temp"].double { println("Temperature: "+ String(format:"%.f", current_temperature) + "°C" } else { println("MORON!") } } })
источник
Весь контроллер представления, который показывает данные в виде сбора с использованием двух методов json parsig
@IBOutlet weak var imagecollectionview: UICollectionView! lazy var data = NSMutableData() var dictdata : NSMutableDictionary = NSMutableDictionary() override func viewDidLoad() { super.viewDidLoad() startConnection() startNewConnection() // Do any additional setup after loading the view, typically from a nib. } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return dictdata.count } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CustomcellCollectionViewCell", forIndexPath: indexPath) as! CustomcellCollectionViewCell cell.name.text = dictdata.valueForKey("Data")?.valueForKey("location") as? String let url = NSURL(string: (dictdata.valueForKey("Data")?.valueForKey("avatar_url") as? String)! ) LazyImage.showForImageView(cell.image, url:"URL return cell } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let kWhateverHeightYouWant = 100 return CGSizeMake(self.view.bounds.size.width/2, CGFloat(kWhateverHeightYouWant)) } func startNewConnection() { let url: URL = URL(string: "YOUR URL" as String)! let session = URLSession.shared let request = NSMutableURLRequest(url: url as URL) request.httpMethod = "GET" //set the get or post according to your request // request.cachePolicy = NSURLRequest.CachePolicy.ReloadIgnoringCacheData request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData let task = session.dataTask(with: request as URLRequest) { ( data, response, error) in guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else { print("error") return } let jsonString = NSString(data: data!, encoding:String.Encoding.utf8.rawValue) as! String } task.resume() } func startConnection(){ let urlPath: String = "your URL" let url: NSURL = NSURL(string: urlPath)! var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)! connection.start() } func connection(connection: NSURLConnection!, didReceiveData data: NSData!){ self.data.appendData(data) } func buttonAction(sender: UIButton!){ startConnection() } func connectionDidFinishLoading(connection: NSURLConnection!) { do { let JSON = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions(rawValue: 0)) guard let JSONDictionary :NSDictionary = JSON as? NSDictionary else { print("Not a Dictionary") // put in function return } print("JSONDictionary! \(JSONDictionary)") dictdata.setObject(JSONDictionary, forKey: "Data") imagecollectionview.reloadData() } catch let JSONError as NSError { print("\(JSONError)") } }
источник
Использование фреймворка ObjectMapper
if let path = Bundle(for: BPPView.self).path(forResource: jsonFileName, ofType: "json") { do { let data = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.mappedIfSafe) let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) self.levels = Mapper<Level>().mapArray(JSONArray: (json as! [[String : Any]]))! print(levels.count) } catch let error as NSError { print(error.localizedDescription) } } else { print("Invalid filename/path.") }
Прежде чем вы должны подготовить набор соответствующих: Сопоставляемых объектов для анализа в
import UIKit import ObjectMapper class Level: Mappable { var levelName = "" var levelItems = [LevelItem]() required init?(map: Map) { } // Mappable func mapping(map: Map) { levelName <- map["levelName"] levelItems <- map["levelItems"] }
import UIKit import ObjectMapper class LevelItem: Mappable { var frontBackSide = BPPFrontBack.Undefined var fullImageName = "" var fullImageSelectedName = "" var bodyParts = [BodyPart]() required init?(map: Map) { } // Mappable func mapping(map: Map) { frontBackSide <- map["frontBackSide"] fullImageName <- map["fullImageName"] fullImageSelectedName <- map["fullImageSelectedName"] bodyParts <- map["bodyParts"] }}
источник
Swift 3
let parsedResult: [String: AnyObject] do { parsedResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:AnyObject] } catch { // Display an error or return or whatever }
данные - это тип данных (структура) (т.е. возвращаемый некоторым ответом сервера)
источник
Этот синтаксический анализатор использует дженерики для преобразования JSON в типы Swift, что сокращает объем кода, который вам нужно набирать.
https://github.com/evgenyneu/JsonSwiftson
struct Person { let name: String? let age: Int? } let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }") let person: Person? = Person( name: mapper["name"].map(), age: mapper["age"].map() )
источник
Ниже приведен пример Swift Playground:
import UIKit let jsonString = "{\"name\": \"John Doe\", \"phone\":123456}" let data = jsonString.data(using: .utf8) var jsonObject: Any do { jsonObject = try JSONSerialization.jsonObject(with: data!) as Any if let obj = jsonObject as? NSDictionary { print(obj["name"]) } } catch { print("error") }
источник
Swift 4
Создать проект
Дизайн StoryBoard с кнопкой и UITableview
Создать TableViewCell VC
В действии кнопки вставьте следующие коды
Помните этот код для выборки массива данных в API
import UIKit class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource { @IBOutlet var tableView: UITableView! var displayDatasssss = [displyDataClass]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return displayDatasssss.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1 cell.label1.text = displayDatasssss[indexPath.row].email return cell } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func gettt(_ sender: Any) { let url = "http://jsonplaceholder.typicode.com/users" var request = URLRequest(url: URL(string: url)!) request.httpMethod = "GET" let configuration = URLSessionConfiguration.default let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) let task = session.dataTask(with: request){(data, response,error)in if (error != nil){ print("Error") } else{ do{ // Array of Data let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray for eachData in fetchData { let eachdataitem = eachData as! [String : Any] let name = eachdataitem["name"]as! String let username = eachdataitem["username"]as! String let email = eachdataitem["email"]as! String self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email)) } self.tableView.reloadData() } catch{ print("Error 2") } } } task.resume() } } class displyDataClass { var name : String var username : String var email : String init(name : String,username : String,email :String) { self.name = name self.username = username self.email = email } }
Это для извлечения данных словаря
import UIKit class ViewController3: UIViewController,UITableViewDelegate,UITableViewDataSource { @IBOutlet var tableView: UITableView! var displayDatasssss = [displyDataClass]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return displayDatasssss.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell1") as! TableViewCell1 cell.label1.text = displayDatasssss[indexPath.row].email return cell } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func gettt(_ sender: Any) { let url = "http://jsonplaceholder.typicode.com/users/1" var request = URLRequest(url: URL(string: url)!) request.httpMethod = "GET" let configuration = URLSessionConfiguration.default let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) let task = session.dataTask(with: request){(data, response,error)in if (error != nil){ print("Error") } else{ do{ //Dictionary data Fetching let fetchData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! [String: AnyObject] let name = fetchData["name"]as! String let username = fetchData["username"]as! String let email = fetchData["email"]as! String self.displayDatasssss.append(displyDataClass(name: name, username: username,email : email)) self.tableView.reloadData() } catch{ print("Error 2") } } } task.resume() } } class displyDataClass { var name : String var username : String var email : String init(name : String,username : String,email :String) { self.name = name self.username = username self.email = email } }
источник
Пример запроса Swift 4 API
Использовать
JSONDecoder().decode
Смотрите это видео Разбор JSON с помощью Swift 4
struct Post: Codable { let userId: Int let id: Int let title: String let body: String }
URLSession.shared.dataTask(with: URL(string: "https://jsonplaceholder.typicode.com/posts")!) { (data, response, error) in guard let response = response as? HTTPURLResponse else { print("HTTPURLResponse error") return } guard 200 ... 299 ~= response.statusCode else { print("Status Code error \(response.statusCode)") return } guard let data = data else { print("No Data") return } let posts = try! JSONDecoder().decode([Post].self, from: data) print(posts) }.resume()
источник
Swift 2 iOS 9
let miadata = NSData(contentsOfURL: NSURL(string: "https://myWeb....php")!) do{ let MyData = try NSJSONSerialization.JSONObjectWithData(miadata!, options: NSJSONReadingOptions.MutableContainers) as? NSArray print(".........\(MyData)") } catch let error as NSError{ // error.description print(error.description) }
источник