2017-02-18 2 views
2

I-Daten wurde Verschlüsselte von API unter Methode getroffen vonParse JSON String Objekttyp Array zu Modell

URLSession.shared.dataTask(with: url!) 

Daten in JSON konvertiert aber trotzdem ist es verschlüsselt

var json = try(JSONSerialization.jsonObject(with: data!, options: .allowFragments)) 

wandelte sie in Zeichenfolge

let arr:String = json as! String 

entschlüsselt

let jsonText = arr.fromBase64()//extension method, given end of question 

jetzt ist es in Json Formate wie unten (dies ist nur ein Datensatz ist, gibt es mehr als 1 Datensätze in JSON-String)

{ 
    "CompanyAlt_Key": 1, 
    "Company_Name": "XYZ LTD", 
    "TableName": "CompanyList" 
}, 

ich ein Modell gleichen Typs haben

public class CompanyList { 
    public var companyAlt_Key : Int? 
    public var company_Name : String? 
    public var tableName : String? 
} 

hier ist fromBase64 Methode

func fromBase64() -> String { 
    let data = NSData.init(base64Encoded: self, options: []) ?? NSData() 
    return String(data: data as Data, encoding: String.Encoding.utf8) ?? "" 
} 

I Problem ist vor das JSON-String in ein Array vom Typ CompanyLi zu erhalten st Klasse

Hilfe schätzen würde

+0

Es scheint nicht, Sie haben verschlüsselte Daten, nur codiert. Der Hauptunterschied besteht darin, dass verschlüsselte Daten einen Schlüssel zum Entschlüsseln und verschlüsselte Daten nicht benötigen. Beispiele für die Verschlüsselung sind AES, RSA und EC, während Codierungsbeispiele hexadezimal, URL-Codierung, ASCII, UTF-8 und Base64 enthalten. – zaph

Antwort

0

Sie werden zunächst Ihre jsonString zu Daten konvertieren müssen:

let jsonData = jsonString.data(using: .utf8)! 

Der Konvertit die Daten in ein Array

let array = JSONSerialization.jsonObject(with: jsonData, options: nil) as? [[String: Any]] 

Dann iterieren das Array ...

let companies = array?.map { 
    return CompanyList(dictionary: $0) 
} 

Implementieren eine init Methode für Ihre CompanyList, in einem Wörterbuch für jeden Datensatz in Ihrer Antwort ...

public class CompanyList { 
    public var companyAlt_Key : Int? 
    public var company_Name : String? 
    public var tableName : String? 

    init(dictionary: [String: Any]) {   
     companyAlt_Key = dictionary["companyAlt_Key"] as? Int 
     company_Name = dictionary["company_Name"] as? String 
     tableName = dictionary["tableName"] as? String 
    } 
} 

Sie können dies auch die Daten zu überprüfen vorbei verwenden. Wenn die Felder in der Klasse nicht optional sind, können Sie ein optionales init wie folgt verwenden ...

public class CompanyList { 
    public var companyAlt_Key : Int 
    public var company_Name : String 
    public var tableName : String 

    init?(dictionary: [String: Any]) {   
     guard let companyAlt_Key = dictionary["companyAlt_Key"] as? Int, 
     let company_Name = dictionary["company_Name"] as? String, 
     let tableName = dictionary["tableName"] as? String else { 
      return nil 
     } 

     self.companyAlt_Key = companyAlt_Key 
     self.company_Name = company_Name 
     self.tableName = tableName 
    } 
} 

Wenn Sie eine optionale init verwenden, verwenden flatMap Sie keine optionalen Elemente gewährleisten müssen in Ihren Array ...

let companies = array?.flatMap { 
    return CompanyList(dictionary: $0) 
} 
+0

Ihr Code wird ohne Fehler ausgeführt, aber wie Objekt des Typs CompanyList in ein Array von CompanyList angefügt wird. in dieser Methode lassen Unternehmen = Array? .map { Rückgabe CompanyList (Wörterbuch: $ 0) }, gibt es zurück, –

+0

Lassen Sie Array = JSONSerialization.jsonObject versuchen (mit: jsonData !, Optionen: []) als? [[String: Any]] Array ist auch Null, –

+0

Um an ein bestehendes Array anzuhängen: 'myArray.append (contentsOf: otherArray)'. –