6
votes

Quelle est la bibliothèque équivalente disponible dans Flutter Dart comme Gson en Java

Existe-t-il une bibliothèque disponible pour enregistrer l'objet et le restaurer.
Dans Android java, nous utilisons Gson pour faire cela mais dans le flutter il n'y a pas de Gson


6 commentaires

J'ai écrit une bibliothèque capable d'analyser automatiquement JSON sur un objet: github.com/gi097/json_parser, la sérialisation vers JSON n'est pas ajoutée.


Peut-être recherchez-vous flutter.io/docs/development/data-and-backend / json


@GiovanniTerlingen est-ce que cela fonctionne si mon JSON a plusieurs tableaux et chaque tableau a plusieurs objets


@GiovanniTerlingen est-il possible de convertir un objet en json en utilisant votre bibliothèque?


Je ne suis pas vraiment sûr mais ça devrait marcher @Midhilaj, vous pouvez toujours l'essayer.


@Midhilaj non, uniquement de json vers une instance d'objet.


4 Réponses :


1
votes

Vous avez pour cela le package built_value .

Avec cela, vous pouvez sérialiser et Désérialiser les objets.

Vous devrez d'abord déclarer l'objet:

var foo = Foo((b) => b
   ..fooValue = "foo"
   ..creationDate = DateTime.now()
);

Tout l'objet devra suivre ce modèle de cadre: - Être une classe abstraite implémentant Built - Déclarer une valeur getter static Serializer - Déclarer le _ () - Déclarer une usine - Déclarer un .part en haut, afin que nous puissions générer un fichier modèle

Je vous recommande de copier la classe et de ne changer que les noms et le modèle. P >

Ensuite, si vous voulez le sérialiser, vous devez créer une classe Serializer

import 'dart:convert' as json;

//...
var jsonEncoded = json.jsonEncode(standardSerializers.serializeWith(Foo.serializer, foo));

En bonus, je posterai ici un sérialiseur personnalisé pour les valeurs de temps:

flutter packages pub run build_runner watch

Après cela, assurez-vous d'exécuter ce qui suit dans le terminal, à la racine de votre dossier de projet:

/// Serializer for [DateTime] using Milliseconds instead of MicroSeconds
///
/// An exception will be thrown on attempt to serialize local DateTime
/// instances; you must use UTC.
class CustomDateTimeSerializer implements PrimitiveSerializer<DateTime> {
  final bool structured = false;
  @override
  final Iterable<Type> types = new BuiltList<Type>([DateTime]);
  @override
  final String wireName = 'DateTime';

  @override
  Object serialize(Serializers serializers, DateTime dateTime,
      {FullType specifiedType = FullType.unspecified}) {
    if (!dateTime.isUtc) {
      throw new ArgumentError.value(
          dateTime, 'dateTime', 'Must be in utc for serialization.');
    }

    return dateTime.microsecondsSinceEpoch / 1000;
  }

  @override
  DateTime deserialize(Serializers serializers, Object serialized,
      {FullType specifiedType = FullType.unspecified}) {
    final microsecondsSinceEpoch = serialized as int;
    return new DateTime.fromMicrosecondsSinceEpoch(microsecondsSinceEpoch * 1000 * 1000,
        isUtc: true);
  }
}

Le journal vous aidera à trouver les erreurs que vous avez dans votre code.

Ensuite, vous aurez les fichiers .g pour chaque modèle.

Vous pouvez maintenant sérialiser l'objet avec:

import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';

part 'serializers.g.dart';

@SerializersFor(const [
  Foo // declare here all the classes to be serialized
])

Serializers serializers = _$serializers;

Serializers standardSerializers =
(serializers.toBuilder()
  ..add(CustomDateTimeSerializer()) // delcare here custom plugins
  ..addPlugin(StandardJsonPlugin())
  ).build();

}

Astuce bonus: cela peut également être utilisé pour avoir un constructeur pour votre objet:

XXX


0 commentaires

5
votes

Une bibliothèque comme GSON ne sera pas possible dans Flutter, car Flutter ne prend pas en charge la réflexion de code. La réflexion interfère avec tremblement d'arbre dont le flottement a besoin pour nettoyer le code inutilisé et donner une application compacte.

en savoir plus sur le sujet et les alternatives ici

Vous pouvez utiliser ce site pour convertir vos JSON en classe et il prépare automatiquement les méthodes toJson fromJson .


0 commentaires

1
votes
Future<void> saveLoginObj(LoginResponse obj) async {
SharedPreferences prefs = await SharedPreferences.getInstance();

try {
    String resp = json.encode(obj);
    await prefs.setString('apiToken',resp);

    // Get
    String token = prefs.getString('apiToken');
    var decoded = json.decode(token);
    LoginResponse loginResponse = LoginResponse.fromJson(decoded);

} on Exception catch (e) {
    print(e);
    throw Exception("Error on save token");
}
}

1 commentaires

Voici quelques conseils pour Comment rédiger une bonne réponse? . Cette réponse fournie peut être correcte, mais elle pourrait bénéficier d'une explication. Les réponses codées uniquement ne sont pas considérées comme de «bonnes» réponses. De examen .



1
votes

J'utilise ce site Web et cela me fait gagner du temps
pas besoin de penser juste au-delà du code JSON ici, il générera le code de classe prefect dart
https://app.quicktype.io/


0 commentaires