Как быстро разобрать файл JSON?

92

У меня есть файл JSON, я хочу проанализировать и использовать список объектов в виде таблицы. Может ли кто-нибудь поделиться кодом для быстрого анализа файла JSON.

кмити
источник
2
Существует учебник здесь , что делает запрос URL и загружает результаты в UITableView
Крис Стоукс
Я написал полностью обновленный API для Swift 3: github.com/borchero/WebParsing
borchero

Ответы:

103

Не может быть проще:

import Foundation

let jsonData: Data = /* get your json data */
let jsonDict = try JSONSerialization.jsonObject(with: jsonData) as? NSDictionary

При этом я настоятельно рекомендую использовать Codable API, представленные в Swift 4.

Акашевский
источник
12
Например,let jsonData = NSData.dataWithContentsOfFile(filepath, options: .DataReadingMappedIfSafe, error: nil)
Кэролайн
4
Проблема с этим подходом заключается в том, что в итоге вы получаете кучу фундаментальных объектов. А именно NSString, NSNumber, NSArray, NSDictionary или NSNull. Что создает чертовски тяжелое бремя, если вы хотите иметь дело с собственным Swift, введенным позже в вашем коде. Особенно, если у вас есть вложенные словари и массивы. Кто-нибудь знает, как с этим бороться?
califrench 07
1
Эти типы связаны между Swift и Obj-C.
akashivskyy 07
2
Правильный путь для загрузки файла в прошивкой 8.1 , кажется: NSData(contentsOfFile: path). См. Developer.apple.com/library/ios/documentation/Cocoa/Reference/… :
Клод,
7
@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.

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-адреса.

Кирит Моди
источник
19

Я только что написал класс 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? ), Обратитесь к этому сообщению для получения инструкций, иначе вы получите ошибку транспортного сервера.

данкогай
источник
Вопрос относительно вашего репозитория на 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 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;
}
Киприан Рарау
источник
4

Кодируемый

В 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
        }
    }
    
Роберт Дреслер
источник
2

Я также написал небольшую библиотеку, которая специализируется на отображении ответа 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
Prine
источник
не могли бы вы помочь мне в создании модели данных с другим примером @Prine
Дилип Тивари
2

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!
}

Отказ от ответственности: я сделал это и надеюсь, что это поможет всем. Не стесняйтесь улучшать его!

Майк Рападас
источник
Простите мое незнание. Каковы преимущества использования вашей библиотеки перед такой, как SwiftyJSON?
Леви Робертс,
6
Изначально я построил это, потому что мне не нравилась идея взлома операторов / символов языка. Кроме того, я создал его, чтобы познакомиться со Swift. Из любопытства я провел тест и обнаружил, что SwiftyJSON имеет превосходную скорость (примерно в 2-7 раз быстрее). Я обновил README репо, чтобы признать это.
Майк Рападас
Спасибо за Ваш ответ.
Леви Робертс
Можете ли вы показать пример того, как вы загрузите массив данных из JSON (несколько элементов, по сути, с циклом и т. Д.)
Джозеф Астрахан,
2

Парсинг 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)!
Перри Триболе
источник
1
Какие у вас проблемы?
Perry Tribolet
Извините за это, я вставлял URL-адрес JSON напрямую, он хорошо работает, вставляя ответ JSON. Было бы здорово, если бы URL вставлялся напрямую. Но блестящая работа для этой утилиты. Благодарю.
ioopl
Созданный вами инструмент просто великолепен. Я использую этот инструмент последние 6 месяцев. Но внезапно, поскольку последние 3 дня ваш веб-сайт недоступен, и браузер отвечает этим сообщением «Этот сайт недоступен». Итак, в чем причина этого?
Саиф
2
  1. Установите Swifty Json

Примечание: если вы ищете это, также велика вероятность, что вы не знаете, как установить 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
  1. Проверить этот пример
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!")
        }
    }
})
OWADVL
источник
1

Весь контроллер представления, который показывает данные в виде сбора с использованием двух методов 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)")
    }    }
Амол Покале
источник
1

Использование фреймворка 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"]
}}
Налойко Евгений
источник
1

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
}

данные - это тип данных (структура) (т.е. возвращаемый некоторым ответом сервера)

Андрей
источник
0

Этот синтаксический анализатор использует дженерики для преобразования 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()
)
Евгений
источник
0

Ниже приведен пример 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")
}
rsc
источник
0

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
    }
}
Тони Францис
источник
0

Пример запроса 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()
Вариф Аханд Риши
источник
0

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)
}
РобертоЛ
источник