Ich habe eine JSON-Datei, möchte die Liste der Objekte in der Tabellenansicht analysieren und verwenden. Kann jemand den Code freigeben, um die JSON-Datei schnell zu analysieren?
Zum Beispiellet jsonData = NSData.dataWithContentsOfFile(filepath, options: .DataReadingMappedIfSafe, error: nil)
Caroline
4
Das Problem bei diesem Ansatz ist, dass Sie am Ende eine Reihe von Fundamentobjekten haben. Nämlich NSString, NSNumber, NSArray, NSDictionary oder NSNull. Dies führt zu einer erheblichen Belastung durch Downcasting, wenn Sie sich mit nativem Swift befassen möchten, das später in Ihren Code eingegeben wird. Besonders wenn Sie verschachtelte Wörterbücher und Arrays haben. Weiß jemand, wie man damit umgeht?
Califrench
1
Diese Typen sind zwischen Swift und Obj-C überbrückt.
@bubakazouba: Schade, dass ich keinen Kommentar ablehnen kann. Einige Dinge: 1. Caroline hat bereits ein Snippet zum Laden von Daten aus einer Datei bereitgestellt (was OP wollte). 2. Ihr Code verwendet eine ASCII-Codierung, bei der alle Unicode-Symbole verloren gehen, einschließlich der Unterstützung für Sprachen außerhalb der englischen Sprache.
Akashivskyy
43
API-Anfrage stellen
var request:NSURLRequest=NSURLRequest(URL: url)var connection:NSURLConnection=NSURLConnection(request: request, delegate:self, startImmediately:false)
Vorbereitung auf die Antwort
Deklarieren Sie ein Array wie folgt
var data:NSMutableData=NSMutableData()
Antwort erhalten
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: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()}}
Wenn NSURLConnectionwir eine Antwort erhalten, können wir erwarten, dass die didReceiveResponseMethode in unserem Namen aufgerufen wird. An diesem Punkt setzen wir einfach unsere Daten zurück self.data = NSMutableData(), indem wir sagen , dass wir ein neues leeres Datenobjekt erstellen.
Nachdem eine Verbindung hergestellt wurde, werden wir Daten in der Methode empfangen didReceiveData. Das Datenargument, das hier übergeben wird, ist der Ursprung all unserer saftigen Informationen. Wir müssen an jedem eingehenden Block festhalten, also hängen wir ihn an das Objekt self.data an, das wir zuvor gelöscht haben.
Wenn die Verbindung hergestellt ist und alle Daten empfangen wurden, connectionDidFinishLoadingwird sie aufgerufen und wir sind bereit, die Daten in unserer App zu verwenden. Hurra!
Die connectionDidFinishLoadinghier verwendete Methode verwendet die NSJSONSerializationKlasse, um unsere Rohdaten in nützliche DictionaryObjekte umzuwandeln, indem die Ergebnisse aus Ihrer URL deserialisiert werden.
Eine Frage zu Ihrem Github-Repo: Wie führen Sie die main.swift tatsächlich aus? Ich habe Probleme, es vom Spielplatz aus auszuführen, da Sie sich anscheinend nicht auf Klassen beziehen können, die in Ihrem eigenen Projekt vom Spielplatz aus definiert wurden (?!). Danke!
Janos
Ich habe Methoden im letzten Repo als öffentlich markiert. Das macht die Mindestanforderung an Beta4, also vergessen Sie nicht, Xcode vor dem Versuch zu aktualisieren
dankogai
Ok, danke, ich habe wirklich gesucht, wie der Beispielcode genau ausgeführt werden soll. Ich habe Playgroung ausprobiert, aber es hat nicht funktioniert, da ich nicht auf die JSON-Klasse verweisen konnte (ein bekanntes Problem, auf das Sie sich nicht auf die Klassen in Ihrem Projekt beziehen können)
Janos
Ich kann es nicht zum Laufen bringen :( Dieses Mal versuche ich nicht, es auf einem Spielplatz zu verwenden. Ich habe Ihr json.swift zu meinem Projekt hinzugefügt und in einer anderen Klasse versuche ich, es zu verwenden. Es funktioniert nicht. Ich habe das einfachste JSON ausprobiert: {"id": "Janos"}, das JSON-Objekt erstellt, seine toString-Methode aufgerufen, den Dateiinhalt korrekt ausgespuckt, aber wenn ich myJson ["id"]. AsString aufrufe, erhalte ich nil. Was vermisse ich?
Janos
Ich habe versucht, ein JSON-Objekt zu erstellen, das im Konstruktor einen String übergibt. Die einzige Frage ist, welche Sie jetzt verwenden sollen, Ihre oder SwiftyJSon :)
Janos
4
Hier ist ein Code zum Durchführen der Konvertierungen zwischen JSON und NSData in Swift 2.0
// Convert from NSData to json object
func nsdataToJSON(data:NSData)->AnyObject?{do{returntryNSJSONSerialization.JSONObjectWithData(data, options:.MutableContainers)}catchlet myJSONError {
print(myJSONError)}returnnil}// Convert from JSON to nsdata
func jsonToNSData(json:AnyObject)->NSData?{do{returntryNSJSONSerialization.dataWithJSONObject(json, options:NSJSONWritingOptions.PrettyPrinted)}catchlet myJSONError {
print(myJSONError)}returnnil;}
In Swift 4+ wird dringend empfohlen, Codableanstelle von zu verwenden JSONSerialization.
Dies Codablebeinhaltet zwei Protokolle: Decodableund Encodable. Mit diesem DecodableProtokoll können Sie Dataim JSON-Format in eine benutzerdefinierte Struktur / Klasse dekodieren , die diesem Protokoll entspricht.
Stellen Sie sich zum Beispiel die Situation vor, dass wir diese einfache haben Data(Array von zwei Objekten)
let data =Data("""
[
{"name":"Steve","age":56},
{"name":"iPhone","age":11}
]
""".utf8)
dann folgendes structProtokoll haben und implementierenDecodable
Jetzt können Sie DataIhre Daten in Ihr Array dekodieren Person, JSONDecoderwobei der erste Parameter dem Typ entspricht, Decodableder diesem Typ entspricht, und dieser Typ sollte Datadekodiert werden
do{let people =tryJSONDecoder().decode([Person].self, from: data)}catch{ print(error)}
... beachten Sie, dass die Dekodierung mit einem trySchlüsselwort gekennzeichnet sein muss, da Sie beispielsweise einen Fehler bei der Benennung machen können und Ihr Modell dann nicht richtig dekodiert werden kann ... Sie sollten es also in den Do-Try-Catch-Block einfügen
Fälle, in denen json eingegeben wird, unterscheiden sich vom Namen der Eigenschaft:
Wenn der Schlüssel mit snake_case benannt ist, können Sie die Decoder festlegen, keyDecodingStrategyzu convertFromSnakeCasedenen der Schlüssel von property_namein camelCase geändert wirdpropertyName
let decoder =JSONDecoder()
decoder.keyDecodingStrategy =.convertFromSnakeCase
let people =try decoder.decode([Person].self, from: data)
Wenn Sie einen eindeutigen Namen benötigen, können Sie Codierungsschlüssel in struct / class verwenden, in denen Sie den Namen des Schlüssels deklarieren
let data =Data("""
{ "userName":"Codable", "age": 1 }
""".utf8)structPerson:Decodable{let name:Stringlet age:IntenumCodingKeys:String,CodingKey{case name ="userName"case age
}}
Ich habe auch eine kleine Bibliothek geschrieben, die sich auf die Zuordnung der JSON-Antwort zu einer Objektstruktur spezialisiert hat. Ich benutze intern die Bibliothek json-swift von David Owens. Vielleicht ist es für jemand anderen nützlich.
Um die Objekte aus der JSON-Antwort tatsächlich zuzuordnen, müssen Sie die Daten nur als Parameter im Konstruktor an die EmployeeContainer-Klasse übergeben. Es erstellt automatisch Ihr Datenmodell.
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)
Vergib mir meine Unwissenheit. Was sind die Vorteile einer Bibliothek gegenüber einer wie SwiftyJSON?
Levi Roberts
6
Anfangs habe ich das gebaut, weil mir die Idee von Sprachhacking-Operatoren / Symbolen nicht gefallen hat. Außerdem habe ich es gebaut, um mich mit Swift vertraut zu machen. Aus Neugier führte ich einen Benchmark durch und stellte fest, dass SwiftyJSON eine überlegene Geschwindigkeit aufweist (~ 2 - 7 mal schneller). Ich habe die README-Datei des Repos aktualisiert, um dies zuzugeben.
Mike Rapadas
Danke für deine Antwort.
Levi Roberts
Können Sie ein Beispiel zeigen, wie Sie ein Array von Daten aus dem JSON laden würden (mehrere Elemente im Wesentlichen mit einer Schleife usw.)
Joseph Astrahan
2
Das Parsen von JSON in Swift ist eine hervorragende Aufgabe für die Codegenerierung. Ich habe unter http://www.guideluxe.com/JsonToSwift ein Tool erstellt , um genau das zu tun.
Sie geben ein Beispiel-JSON-Objekt mit einem Klassennamen an, und das Tool generiert eine entsprechende Swift-Klasse sowie alle erforderlichen untergeordneten Swift-Klassen, um die durch das Beispiel-JSON implizierte Struktur darzustellen. Ebenfalls enthalten sind Klassenmethoden, die zum Auffüllen von Swift-Objekten verwendet werden, einschließlich einer Methode, die die NSJSONSerialization.JSONObjectWithData-Methode verwendet. Die erforderlichen Zuordnungen von den NSArray- und NSDictionary-Objekten werden bereitgestellt.
Aus dem generierten Code müssen Sie nur ein NSData-Objekt angeben, das JSON enthält und mit dem dem Tool bereitgestellten Beispiel übereinstimmt.
Außer Foundation gibt es keine Abhängigkeiten.
Meine Arbeit wurde von http://json2csharp.com/ inspiriert , was für .NET-Projekte sehr praktisch ist.
So erstellen Sie ein NSData-Objekt aus einer JSON-Datei.
let fileUrl: NSURL =NSBundle.mainBundle().URLForResource("JsonFile", withExtension:"json")!let jsonData:NSData=NSData(contentsOfURL: fileUrl)!
Tut mir leid, ich habe die JSON-URL direkt eingefügt. Es funktioniert gut, wenn die JSON-Antwort eingefügt wird. Es wäre fabelhaft, wenn die URL direkt eingefügt würde. Aber brillante Arbeit für dieses Dienstprogramm. Vielen Dank.
Ioopl
Das Tool, das Sie erstellt haben, ist einfach fantastisch. Ich benutze dieses Tool seit 6 Monaten. Aber plötzlich seit den letzten 3 Tagen ist Ihre Website nicht mehr erreichbar und der Browser antwortet mit der Meldung "Diese Website kann nicht erreicht werden". Also, was ist der Grund dafür?
Hinweis: Wenn Sie danach suchen, besteht auch eine hohe Wahrscheinlichkeit, dass Sie nicht wissen, wie Sie installieren sollen swifty. Folgen Sie den Anweisungen hier .
sudo gem install cocoapods
cd ~/Path/To/Folder/Containing/ShowTracker
Geben Sie als nächstes diesen Befehl ein:
pod init
Dadurch wird ein Standard Podfilefür Ihr Projekt erstellt. Hier Podfiledefinieren Sie die Abhängigkeiten, auf die sich Ihr Projekt stützt.
Geben Sie diesen Befehl zum Öffnen Podfilemit Xcodefür die Bearbeitung:
open-a XcodePodfile
Fügen Sie das Swiftyin die Poddatei ein
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
pod 'SwiftyJSON', '~> X.X.X'
end
let parsedResult:[String:AnyObject]do{
parsedResult =tryJSONSerialization.jsonObject(with: data, options:.allowFragments)as![String:AnyObject]}catch{// Display an error or return or whatever
}
Daten - es ist Datentyp (Struktur) (dh von einer Serverantwort zurückgegeben)
Antworten:
Einfacher geht es nicht:
Trotzdem empfehle ich dringend, in Swift 4 eingeführte codierbare APIs zu verwenden .
quelle
let jsonData = NSData.dataWithContentsOfFile(filepath, options: .DataReadingMappedIfSafe, error: nil)
NSData(contentsOfFile: path)
. Siehe developer.apple.com/library/ios/documentation/Cocoa/Reference/… :API-Anfrage stellen
Vorbereitung auf die Antwort
Deklarieren Sie ein Array wie folgt
Antwort erhalten
1.
2.
3.
Wenn
NSURLConnection
wir eine Antwort erhalten, können wir erwarten, dass diedidReceiveResponse
Methode in unserem Namen aufgerufen wird. An diesem Punkt setzen wir einfach unsere Daten zurückself.data = NSMutableData()
, indem wir sagen , dass wir ein neues leeres Datenobjekt erstellen.Nachdem eine Verbindung hergestellt wurde, werden wir Daten in der Methode empfangen
didReceiveData
. Das Datenargument, das hier übergeben wird, ist der Ursprung all unserer saftigen Informationen. Wir müssen an jedem eingehenden Block festhalten, also hängen wir ihn an das Objekt self.data an, das wir zuvor gelöscht haben.Wenn die Verbindung hergestellt ist und alle Daten empfangen wurden,
connectionDidFinishLoading
wird sie aufgerufen und wir sind bereit, die Daten in unserer App zu verwenden. Hurra!Die
connectionDidFinishLoading
hier verwendete Methode verwendet dieNSJSONSerialization
Klasse, um unsere Rohdaten in nützlicheDictionary
Objekte umzuwandeln, indem die Ergebnisse aus Ihrer URL deserialisiert werden.quelle
Ich habe gerade eine Klasse namens JSON geschrieben, die die JSON-Behandlung in Swift so einfach macht wie das JSON-Objekt in ES5.
Schalten Sie Ihr schnelles Objekt wie folgt in JSON um:
... oder String ...
... oder URL.
Durchlaufen Sie einfach Elemente per Index:
Genau wie bei SwiftyJSON machen Sie sich keine Sorgen, wenn der tiefgestellte Eintrag nicht vorhanden ist.
Wenn Sie die Indizes satt haben, fügen Sie Ihr Schema folgendermaßen hinzu:
Und du gehst:
Hoffe du magst es.
Mit dem neuen xCode 7.3+ ist es wichtig, Ihre Domain zur Ausnahmeliste hinzuzufügen ( Wie kann ich NSAppTransportSecurity zu meiner info.plist-Datei hinzufügen? ). Anweisungen finden Sie in diesem Beitrag. Andernfalls wird ein Transportberechtigungsfehler angezeigt.
quelle
Hier ist ein Code zum Durchführen der Konvertierungen zwischen JSON und NSData in Swift 2.0
quelle
Codierbar
In Swift 4+ wird dringend empfohlen,
Codable
anstelle von zu verwendenJSONSerialization
.Dies
Codable
beinhaltet zwei Protokolle:Decodable
undEncodable
. Mit diesemDecodable
Protokoll können SieData
im JSON-Format in eine benutzerdefinierte Struktur / Klasse dekodieren , die diesem Protokoll entspricht.Stellen Sie sich zum Beispiel die Situation vor, dass wir diese einfache haben
Data
(Array von zwei Objekten)dann folgendes
struct
Protokoll haben und implementierenDecodable
Jetzt können Sie
Data
Ihre Daten in Ihr Array dekodierenPerson
,JSONDecoder
wobei der erste Parameter dem Typ entspricht,Decodable
der diesem Typ entspricht, und dieser Typ sollteData
dekodiert werden... beachten Sie, dass die Dekodierung mit einem
try
Schlüsselwort gekennzeichnet sein muss, da Sie beispielsweise einen Fehler bei der Benennung machen können und Ihr Modell dann nicht richtig dekodiert werden kann ... Sie sollten es also in den Do-Try-Catch-Block einfügenFälle, in denen json eingegeben wird, unterscheiden sich vom Namen der Eigenschaft:
Wenn der Schlüssel mit snake_case benannt ist, können Sie die Decoder festlegen,
keyDecodingStrategy
zuconvertFromSnakeCase
denen der Schlüssel vonproperty_name
in camelCase geändert wirdpropertyName
Wenn Sie einen eindeutigen Namen benötigen, können Sie Codierungsschlüssel in struct / class verwenden, in denen Sie den Namen des Schlüssels deklarieren
quelle
Ich habe auch eine kleine Bibliothek geschrieben, die sich auf die Zuordnung der JSON-Antwort zu einer Objektstruktur spezialisiert hat. Ich benutze intern die Bibliothek json-swift von David Owens. Vielleicht ist es für jemand anderen nützlich.
https://github.com/prine/ROJSONParser
Beispiel Employees.json
Als nächsten Schritt müssen Sie Ihr Datenmodell erstellen (EmplyoeeContainer und Employee).
Employee.swift
EmployeeContainer.swift
Um die Objekte aus der JSON-Antwort tatsächlich zuzuordnen, müssen Sie die Daten nur als Parameter im Konstruktor an die EmployeeContainer-Klasse übergeben. Es erstellt automatisch Ihr Datenmodell.
Die Konsolenausgabe sieht dann wie folgt aus:
quelle
SwiftJSONParse : Analysiere JSON wie einen Badass
Ganz einfach und leicht zu lesen!
Beispiel: das Wert
"mrap"
ausnicknames
als String aus dieser JSON - AntwortEs nimmt Ihre JSON-Daten so
NSData
wie sie sind, ohne dass eine Vorverarbeitung erforderlich ist.Haftungsausschluss: Ich habe das gemacht und hoffe, es hilft allen. Fühlen Sie sich frei, es zu verbessern!
quelle
Das Parsen von JSON in Swift ist eine hervorragende Aufgabe für die Codegenerierung. Ich habe unter http://www.guideluxe.com/JsonToSwift ein Tool erstellt , um genau das zu tun.
Sie geben ein Beispiel-JSON-Objekt mit einem Klassennamen an, und das Tool generiert eine entsprechende Swift-Klasse sowie alle erforderlichen untergeordneten Swift-Klassen, um die durch das Beispiel-JSON implizierte Struktur darzustellen. Ebenfalls enthalten sind Klassenmethoden, die zum Auffüllen von Swift-Objekten verwendet werden, einschließlich einer Methode, die die NSJSONSerialization.JSONObjectWithData-Methode verwendet. Die erforderlichen Zuordnungen von den NSArray- und NSDictionary-Objekten werden bereitgestellt.
Aus dem generierten Code müssen Sie nur ein NSData-Objekt angeben, das JSON enthält und mit dem dem Tool bereitgestellten Beispiel übereinstimmt.
Außer Foundation gibt es keine Abhängigkeiten.
Meine Arbeit wurde von http://json2csharp.com/ inspiriert , was für .NET-Projekte sehr praktisch ist.
So erstellen Sie ein NSData-Objekt aus einer JSON-Datei.
quelle
Hinweis: Wenn Sie danach suchen, besteht auch eine hohe Wahrscheinlichkeit, dass Sie nicht wissen, wie Sie installieren sollen
swifty
. Folgen Sie den Anweisungen hier .Geben Sie als nächstes diesen Befehl ein:
Dadurch wird ein Standard
Podfile
für Ihr Projekt erstellt. HierPodfile
definieren Sie die Abhängigkeiten, auf die sich Ihr Projekt stützt.Geben Sie diesen Befehl zum Öffnen
Podfile
mitXcode
für die Bearbeitung:Fügen Sie das
Swifty
in die Poddatei einquelle
Der gesamte Viewcontroller, der Daten in der Sammlungsansicht mit zwei Methoden von json parsig anzeigt
quelle
Verwenden des ObjectMapper-Frameworks
Bevor Sie den Satz geeigneter: Zuordnbarer Objekte zum Parsen vorbereiten sollten
quelle
Swift 3
Daten - es ist Datentyp (Struktur) (dh von einer Serverantwort zurückgegeben)
quelle
Dieser Parser verwendet Generika, um JSON in Swift-Typen umzuwandeln, wodurch der Code, den Sie eingeben müssen, reduziert wird.
https://github.com/evgenyneu/JsonSwiftson
quelle
Unten sehen Sie ein Beispiel für einen schnellen Spielplatz:
quelle
Swift 4
Erstellen Sie ein Projekt
Entwerfen Sie StoryBoard mit einem Button und einer UITableview
Erstellen Sie TableViewCell VC
Fügen Sie in Button Action die folgenden Codes ein
Denken Sie an diesen Code zum Abrufen von Datenarrays in einer API
Dies ist für das Abrufen von Wörterbuchdaten vorgesehen
quelle
Swift 4 API-Anforderungsbeispiel
Gebrauch machen von
JSONDecoder().decode
Sehen Sie sich dieses Video an, in dem JSON mit Swift 4 analysiert wird
quelle
Swift 2 iOS 9
quelle