Swift в XCode: как разбирать массив JSON и сохранять каждое значение в строке [duplicate]

float("545.2222") и int(float("545.2222"))

78
задан rmaddy 3 June 2014 в 17:31
поделиться

16 ответов

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

import Foundation

var error: NSError?
let jsonData: NSData = /* get your json data */

let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary
86
ответ дан Moritz 25 August 2018 в 22:57
поделиться

Весь диспетчер представлений, который отображает данные в виде коллекций с использованием двух методов 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
ответ дан Amol Pokale 25 August 2018 в 22:57
поделиться

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
}

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

1
ответ дан Andrey 25 August 2018 в 22:57
поделиться

Вот код для конверсий между 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
ответ дан Ciprian Rarau 25 August 2018 в 22:57
поделиться

Я просто написал класс под названием 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                  
19
ответ дан Community 25 August 2018 в 22:57
поделиться

Этот синтаксический анализатор использует обобщения для передачи типов 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
ответ дан Evgenii 25 August 2018 в 22:57
поделиться

Как вызвать веб-службу и получить ответ в Swift Проверить IT

Выполнение запроса 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 и мы готовы использовать данные в нашем приложении. Hooray!

Метод connectionDidFinishLoading использует класс NSJSONSerialization для преобразования наших исходных данных в полезные словарные объекты путем десериализации результатов с вашего URL.

43
ответ дан Kirit Modi 25 August 2018 в 22:57
поделиться

SwiftJSONParse : Parse JSON как badass

Dead-simple и легко читается!

Пример: получить значение "mrap" с nicknames как строка из этого ответа JSON

{
    "other": {
        "nicknames": ["mrap", "Mikee"]
}

Он принимает ваши данные json NSData как есть, не нужно препроцессить.

let parser = JSONParser(jsonData)

if let handle = parser.getString("other.nicknames[0]") {
    // that's it!
}

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

2
ответ дан Mike Rapadas 25 August 2018 в 22:57
поделиться

Использование Framework 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
ответ дан Naloiko Eugene 25 August 2018 в 22:57
поделиться

Шаг 1. Установите Swifty Json https://github.com/SwiftyJSON/SwiftyJSON

Примечание: , если вы ищете для этого есть также высокая вероятность того, что вы не знаете, как установить swifty. Следуйте инструкциям на странице https://guides.cocoapods.org/using/getting-started.html#toc_3

sudo gem install cocoapods

cd ~ / Path / To / Folder / Containing / ShowTracker

Затем введите эту команду:

pod init

Это создаст файл подкаста по умолчанию для вашего проект. Подкаст - это то, где вы определяете зависимости, на которые опирается ваш проект.

Введите эту команду, чтобы открыть Podfile с помощью Xcode для редактирования:

open -a Xcode Podfile

Добавить Swifty в podfile

platform :ios, '8.0'
use_frameworks!

target 'MyApp' do
    pod 'SwiftyJSON', '~> X.X.X'
end

Шаг 2. Проверьте этот пример

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

                    }
                })

Шаг 3. Прибыль

2
ответ дан OWADVL 25 August 2018 в 22:57
поделиться

Разбор JSON в Swift - отличная работа для генерации кода. Я создал инструмент на http://www.guideluxe.com/JsonToSwift , чтобы сделать именно это.

Вы поставляете образец объекта JSON с именем класса и инструментом будет генерировать соответствующий класс Swift, а также любые вспомогательные классы Swift для представления структуры, подразумеваемой образцом JSON. Также включены методы класса, используемые для заполнения объектов Swift, в том числе метода, который использует метод NSJSONSerialization.JSONObjectWithData. Предоставляются необходимые сопоставления из объектов NSArray и NSDictionary.

Из сгенерированного кода вам нужно только предоставить объект NSData, содержащий JSON, который соответствует образцу, предоставленному инструменту.

Моя работа была вдохновлена ​​ http://json2csharp.com/ , что очень удобно для .NET-проектов.

Вот как создать объект NSData из файла JSON.

let fileUrl: NSURL = NSBundle.mainBundle().URLForResource("JsonFile", withExtension: "json")!
let jsonData: NSData = NSData(contentsOfURL: fileUrl)!
2
ответ дан Perry Tribolet 25 August 2018 в 22:57
поделиться

Я также написал небольшую библиотеку, которая специализирована для отображения ответа 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
2
ответ дан Prine 25 August 2018 в 22:57
поделиться

Swift2 iOs9

   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)
    }
0
ответ дан RobertoL 25 August 2018 в 22:57
поделиться

Ниже приведен пример 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")
}
0
ответ дан rsc 25 August 2018 в 22:57
поделиться

Swift 4

Создать проект

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

Это для данных словаря Fetching

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
ответ дан Tony Franzis 25 August 2018 в 22:57
поделиться

Пример запроса API Swift 4

Использовать 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
ответ дан Warif Akhand Rishi 25 August 2018 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: