2017-12-08 3 views
0

Bitte leiten Sie mich zu einem möglichen Duplikat, aber in meiner Forschung war ich nicht in der Lage, eine Lösung zu finden. HierArray of Struct - Codable

ist das JSON-Objekt Ich versuche, von meinem REST API zu entschlüsseln:

{ 
    "name": "Oak", 

    "leaves":[ 
    { 
     "id": "1A", 
     "damaged": false 
    }, 
    { 
     "id": "2A", 
     "damaged": false 
    }, 
    { 
     "id": "3E", 
     "damaged": false 
    } 
] 

} 

Hier ist der Code so weit:

struct Tree: Codable { 
    var name : String? 
    var leaves : [Leaf]? 

    init() { 
     self.name = string() 
     self.leaves = [] 
    } 
} 

struct Leaf: Codable { 
    var id : String? 
    var damaged : Bool? 

    init(){ 
     self.id = String() 
     self.damaged = Bool() 
    } 
} 

Jetzt, wenn ich die API verbrauchen ich die dekodieren Antwort mit:

let jsonDecoder = JSONDecoder() 
let time = try jsonDecoder.decode(Tree.self, from: data) 

Wenn ich versuche, für diese API zu dekodieren erhalte ich:

"Die Daten konnten nicht gelesen werden, da sie nicht im richtigen Format vorliegen."

Ich schätze jede Anleitung, die Sie zur Verfügung stellen können, danke!

Auch die Init sind da wegen ihrer Verwendung als Singleton, ich bin nicht auf der Suche nach einem Vorschlag, das Singleton-Muster nicht zu verwenden, ich bin nur daran interessiert herauszufinden, was das Problem mit dieser Decodierung ist.

Bearbeiten:

Vielen Dank für Ihre Antworten! Ich dachte, das Problem käme von Array von Custom Struct, aber es war tatsächlich viel einfacher und ich fühle mich dumm. Überprüfen Sie meine Antwort unten.

Also noch einmal, vielen Dank für die Anleitung, die mich gedemütigt!

+4

, wie Sie "Daten" instanziiert? Kannst du den Code posten? –

+0

Ich sehe nichts falsch mit Ihrem Code anders als 'self.name = string()' das sollte sein 'self.name = String()' –

+0

Ich würde auch empfehlen, Ihre Eigenschaften als Konstanten zu deklarieren. Über Ihre Singleton machen Sie die Eigenschaft optional –

Antwort

0

Für jeden, der diese Frage für das benutzerdefinierte Struct in einem Array für swift4 betrachtet, funktioniert dieser Code wie erwartet.

Ich habe einen Parameter in meinen Daten verpasst, als ich die Frage stellte, dass es nicht das Problem war. Das zusätzliche Feld ist jetzt unter und mein Problem war, dass ich das Datum als Int32 deklarierte? anstelle von Int64 ?.

{ 
    "name": "Oak", 
    "discoveryDate": 1514178000000, 

    "leaves":[ 
    { 
     "id": "1A", 
     "damaged": false 
    }, 
    { 
     "id": "2A", 
     "damaged": false 
    }, 
    { 
     "id": "3E", 
     "damaged": false 
    } 
] 

} 

, die die Strukturen sich ändern würde:

struct Tree: Codable { 
    var name : String? 
    var discoveryDate : Int64? 
    var leaves : [Leaf]? 

    init() { 
     self.name = String() 
     self.discoveryDate = Int64() 
     self.leaves = [] 
    } 
} 

struct Leaf: Codable { 
    var id : String? 
    var damaged : Bool? 

    init(){ 
     self.id = String() 
     self.damaged = Bool() 
    } 
} 
+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/18198478) – kometen