วิธีแยกวิเคราะห์ไฟล์ 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)
Caroline

4
ปัญหาของวิธีการนี้คือคุณจบลงด้วยวัตถุรากฐานจำนวนมาก ได้แก่ NSString, NSNumber, NSArray, NSDictionary หรือ NSNull ซึ่งจะสร้างภาระในการคัดเลือกนักแสดงที่ลดลงหากคุณต้องการจัดการกับ Swift ดั้งเดิมที่พิมพ์ไว้ในโค้ดของคุณในภายหลัง โดยเฉพาะอย่างยิ่งถ้าคุณมีพจนานุกรมและอาร์เรย์ซ้อนกัน ไม่มีใครรู้วิธีจัดการกับเรื่องนี้?
califrench

1
ประเภทเหล่านี้เชื่อมระหว่าง Swift และ Obj-C
akashivskyy

2
วิธีที่ถูกต้องในการโหลดไฟล์ใน iOS 8.1 NSData(contentsOfFile: path)น่าจะเป็น: ดูdeveloper.apple.com/library/ios/documentation/Cocoa/Reference/… :
Claude

7
@bubakazouba: สงสารฉันไม่สามารถลงคะแนนความคิดเห็นได้ สองสิ่ง: 1. Caroline ได้จัดเตรียมตัวอย่างสำหรับการโหลดข้อมูลจากไฟล์ไว้แล้ว (ซึ่งเป็นสิ่งที่ OP ต้องการ) 2. รหัสของคุณใช้การเข้ารหัส ASCII ซึ่งจะสูญเสียสัญลักษณ์ Unicode ทั้งหมดรวมถึงการรองรับภาษาอื่น ๆ นอกเหนือจากภาษาอังกฤษ
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วัตถุโดย deserializing ผลที่ได้จาก 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 ของฉันได้อย่างไร ) โปรดดูคำแนะนำในการโพสต์นี้มิฉะนั้นคุณจะได้รับข้อผิดพลาดในการขนส่ง


คำถามเกี่ยวกับ repo Github ของคุณ: คุณใช้งาน main.swift ได้อย่างไร? ฉันมีปัญหาในการดำเนินการจากภายในสนามเด็กเล่นเนื่องจากคุณไม่สามารถอ้างถึงชั้นเรียนที่กำหนดไว้ในโครงการของคุณเองได้จากสนามเด็กเล่นขอบคุณ
Janos

ฉันได้ทำเครื่องหมายวิธีการเป็นสาธารณะใน repo ล่าสุด ที่ทำให้ข้อกำหนดขั้นต่ำเป็น Beta4 ดังนั้นอย่าลืมอัพเกรด Xcode ก่อนลอง
dankogai

โอเคขอบคุณมากฉันกำลังมองหาวิธีรันโค้ดตัวอย่างจริงๆ ฉันลอง playgroung แต่ไม่ได้ผลเนื่องจากฉันไม่สามารถอ้างอิงคลาส JSON ได้ (เป็นปัญหาที่ทราบแล้วที่คุณไม่สามารถอ้างถึงคลาสในโปรเจ็กต์ของคุณได้)
Janos

ฉันไม่สามารถใช้งานได้ :( คราวนี้ฉันไม่ได้พยายามใช้มันในสนามเด็กเล่นฉันได้เพิ่ม json.swift ของคุณในโปรเจ็กต์ของฉันและฉันพยายามใช้มันในคลาสอื่นมันไม่ได้ผล ฉันลองใช้ JSON ที่ง่ายที่สุด: {"id": "Janos"} สร้างออบเจ็กต์ JSON ที่เรียกว่าเมธอด toString ซึ่งจะคายเนื้อหาไฟล์ออกมาอย่างถูกต้องอย่างไรก็ตามเมื่อฉันเรียก myJson ["id"] asString ฉันจะไม่มีอะไร ฉันขาดอะไรไป
Janos

ฉันพยายามสร้างออบเจ็กต์ JSON ผ่านสตริงในตัวสร้าง ... ฉันเปลี่ยนเป็นวิธีที่คุณทำในตัวอย่างตอนนี้มันใช้งานได้ดี คำถามเดียวคือจะใช้ตอนนี้ของคุณหรือ SwiftyJSon :)
Janos

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

Codable

ในสวิฟท์ 4 + ขอแนะนำให้ใช้แทนCodableJSONSerialization

ซึ่ง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เป็น camelCase ได้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 จาก David Owens เป็นการภายใน บางทีมันอาจจะมีประโยชน์สำหรับคนอื่น

https://github.com/prine/ROJSONParser

ตัวอย่างพนักงาน json

{
"employees": [
  {
    "firstName": "John",
    "lastName": "Doe",
    "age": 26
  },
  {
    "firstName": "Anna",
    "lastName": "Smith",
    "age": 30
  },
  {
    "firstName": "Peter",
    "lastName": "Jones",
    "age": 45
  }]
}

ขั้นตอนต่อไปคุณต้องสร้างแบบจำลองข้อมูลของคุณ (EmplyoeeContainer และ Employee)

พนักงานสวิฟท์

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
Dilip Tiwari

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 คืออะไร?
Levi Roberts

6
เริ่มแรกฉันสร้างสิ่งนี้ขึ้นมาเพราะฉันไม่ชอบแนวคิดของตัวดำเนินการ / สัญลักษณ์แฮ็กภาษา นอกจากนี้ฉันสร้างมันขึ้นมาเพื่อทำความคุ้นเคยกับ Swift ด้วยความอยากรู้อยากเห็นฉันใช้เกณฑ์มาตรฐานและพบว่า SwiftyJSON มีความเร็วที่เหนือกว่า (เร็วกว่าประมาณ 2 - 7 เท่า) ฉันได้อัปเดต README ของ repo เพื่อยอมรับแล้ว
Mike Rapadas

ขอบคุณสำหรับคำตอบ.
Levi Roberts

คุณสามารถแสดงตัวอย่างได้ไหมว่าคุณจะโหลดอาร์เรย์ของข้อมูลจาก JSON ได้อย่างไร (หลายรายการโดยใช้ลูปเป็นต้น ... )
Joseph Astrahan

2

การแยกวิเคราะห์ 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)!

1
คุณมีปัญหาอะไร
Perry Tribolet

ขออภัยฉันกำลังวาง JSON URL โดยตรงซึ่งทำงานได้ดีโดยการวางการตอบสนอง JSON จะดีมากที่จะวาง URL โดยตรง แต่งานที่ยอดเยี่ยมสำหรับยูทิลิตี้นี้ ขอบคุณ.
ioopl

เครื่องมือที่คุณสร้างขึ้นนั้นยอดเยี่ยมมาก ฉันใช้เครื่องมือนี้ตั้งแต่ 6 เดือนที่แล้ว แต่ทันใดนั้นเองตั้งแต่ 3 วันที่แล้วเว็บไซต์ของคุณไม่สามารถเข้าถึงได้ & เบราว์เซอร์ตอบสนองด้วยข้อความนี้ "ไม่สามารถเข้าถึงไซต์นี้ได้" แล้วเหตุผลเบื้องหลังนี้คืออะไร?
Saif

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ลงใน podfile

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

1

viewcontroller ทั้งหมดซึ่งแสดงข้อมูลในมุมมอง collcction โดยใช้ 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 framework

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

สวิฟต์ 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

โปรแกรมแยกวิเคราะห์นี้ใช้ generics ในการแคสต์ประเภท 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")
}

0

สวิฟต์ 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)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.