2016-11-29 8 views
0

Ich hätte gerne Objekte serialisiert/deserialisiert von JSON in Flutter. Ich weiß, ich kann JsonDecoder von json.dart verwenden, die mir String-Taste basierte LinkedHashMap gibt, aber ich bin mehr interessiert an ObjectMapper Ansatz, so dass ich in der Lage bin getippt Antwort von Deserialisierung.JSON ObjectMapper in flattern

Ich versuchte redstone Mapper (link) und exportierbare Bibliothek (link) mit Flutter - die ich beide richtig kompilieren nicht in der Lage bin. Ich glaube, dass das Problem mit der Reflexionsbibliothek von Dart verbunden ist.

Wie kann ich einen funktionierenden Object-Json Mapper mit Flutter erreichen?

Beispielcode:

class A { 

    @Field() 
    String b; 
} 

import 'package:redstone_mapper/mapper.dart'; 
import 'package:redstone_mapper/mapper_factory.dart'; 

bootstrapMapper(); 
var desObj = decodeJson(jsonString, A); 

Fehler:

Starting device daemon... 
Running lib/main.dart on Nexus 5X... 
Dart snapshot generator failed with exit code 254 
Errors encountered while loading: 'dart:mirrors': error: line 1 pos 1: unexpected token 'Unhandled' 

oder diese:

Error detected in application source code: 
error: Failed to load main script: 
'package:redstone_mapper/mapper_factory.dart': error: line 4 pos 1: import of dart:mirrors with --enable-mirrors=false 
import 'dart:mirrors'; 

Antwort

5

Das Problem mit den Bibliotheken versucht, ist, dass sie dart:mirrors verwenden, was nicht ist unterstützt auf Flutter.

Sie sollten eine Bibliothek versuchen, die anstelle CODEGEN verwendet, zum Beispiel built_value: https://github.com/google/built_value.dart

+0

Verwendung dieser Bibliothek ist mehr als das Hinzufügen eines einfachen ' 'import'' Aussage. Nachschlagen meine Antwort [hier] (http://stackoverflow.com/a/41251216/706387) –

0

Als @HarryTerkelsen vorgeschlagen dort built_value Bibliothek von Google ist.

Serialisierungsbeispiel kann here gefunden werden. Der Nachteil ist, dass built_value verwendet * .g.dart Klassen verwendet, um Serialisierer zu erstellen, so dass diese Bibliothek nicht eine einfache "Import & run" Sache ist.

Es gibt ein Beispielprojekt, das die Sammelserialisierung zeigt. Collection und die generated serializer.

Kurz gesagt - Sie müssen this ausführen, um Ihre Serialisierer zu generieren.

EDIT:

Am Ende habe ich einfach Serialisierung von Grund auf neu zu schreiben endete:

import 'dart:convert'; 

class ItemDescription { 
    String tag; 

    String name; 

    static ItemDescription deserialize(String str) { 
    JsonDecoder decoder = new JsonDecoder(); 
    var deserializedMap = decoder.convert(str); 
    return deserialize(deserializedMap); 
    } 

    static ItemDescription deserializeMap(Map map) { 
     ItemDescription description = new ItemDescription(); 
     description.name = map["name"]; 
     description.tag = map["symbol"]; 
     return description; 
    } 
} 
+0

Sollte die letzte Zeile der "deserialize" -Methode aufrufen "deserializeMap", anstatt selbst? – breadbin

+0

Könnten Sie bitte ein Beispiel hinzufügen, wie dies verwendet würde. Danke im Voraus – RexFuzzle