【问题标题】:What is the equlent libary avalable in flutter dart like Gson in java什么是flutter dart中可用的等效库,例如java中的Gson
【发布时间】:2019-01-04 09:51:14
【问题描述】:

是否有任何库可用于保存和恢复对象。
在 android java 中我们使用 Gson 来执行此操作,但在颤振中没有 Gson

【问题讨论】:

  • 我写了一个库,可以自动将 JSON 解析为对象:github.com/gi097/json_parser,没有添加序列化为 JSON。
  • @GiovanniTerlingen 如果我的 JSON 有多个数组并且每个数组有多个对象,它是否有效
  • @GiovanniTerlingen 是否可以使用您的库将对象转换为 json?
  • 我不太确定,但它应该可以工作@Midhilaj,你总是可以试一试。

标签: dart flutter android gson


【解决方案1】:

像 GSON 这样的库在 Flutter 中是不可能的,因为 Flutter 不支持代码反射。反射干扰tree shaking,flutter 需要清理未使用的代码并提供紧凑的应用程序。

more on the topic and alternatives here

您可以使用this site to convert your JSONs 来上课,它会自动准备 toJson fromJson 方法。

【讨论】:

  • 但是 dart 是否支持反射?通过 dart:mirrors 库
  • 根据我分享的链接,这个在flutter框架中是禁用的。
【解决方案2】:

我正在使用这个网站,它节省了我的时间
无需考虑这里的 JSON 代码,它将生成完美的 dart 类代码
https://app.quicktype.io/

【讨论】:

    【解决方案3】:

    你有这个built_value包。

    你可以序列化和反序列化对象。

    首先你需要声明对象:

    part 'foo.g.dart'; 
    
    abstract class Foo
        implements Built<Foo, FooBuilder>{
      static Serializer<Foo> get serializer => _$fooSerializer;
    
      String get fooValue;
    
      @nullable int get creationDate;
    
      Foo._();
    
      factory Foo([updates(FooBuilder b)]) = _$Foo;
    }
    

    所有对象都必须遵循这个框架模型: - 作为一个抽象类实现Built - 声明一个 static Serializer getter 值 - 声明_() - 声明factory - 在顶部声明一个.part,这样我们就可以生成模型文件了

    我建议您复制类并仅更改名称和模型。

    然后,如果你想序列化它,你必须创建一个Serializer

    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();
    
    }
    

    作为奖励,我将在此处发布时间值的自定义序列化程序:

    /// 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);
      }
    }
    

    在此之后,请确保在终端中,在项目文件夹的根目录中运行以下命令:

    flutter packages pub run build_runner watch
    

    日志将帮助您找到代码中的错误。

    然后,您将拥有每个模型的 .g 文件。

    您现在可以使用以下命令序列化对象:

    import 'dart:convert' as json;
    
    //...
    var jsonEncoded = json.jsonEncode(standardSerializers.serializeWith(Foo.serializer, foo));
    

    额外提示:这也可用于为您的对象创建构建器:

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

    【讨论】:

      【解决方案4】:
      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");
      }
      

      }

      【讨论】:

      • 以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review
      猜你喜欢
      • 1970-01-01
      • 2021-10-18
      • 2019-06-15
      • 2018-11-10
      • 2018-08-07
      • 2022-12-03
      • 2022-01-05
      • 2020-07-17
      • 1970-01-01
      相关资源
      最近更新 更多