由于Flutter从它的SDK中取出了dart:mirror,因此不再可能像dartson这样的库使用 JSON来对象序列化/反序列化.但是我读过build_value是达到类似目的的另一种方式.我找不到任何关于如何实施它的好例子,因为它包含大量的锅炉板代码.有人能举个例子吗?例如,这是我正在尝试序列化到对象的JSON:
{
"name":"John","age":30,"cars": [
    { "name":"Ford","models":[ "Fiesta","Focus","Mustang" ] },{ "name":"BMW","models":[ "320","X3","X5" ] },{ "name":"Fiat","models":[ "500","Panda" ] }
]

}

解决方法

我希望从提供的答案中获得更多细节.尽管它们是很好的建议,但它们对我来说太过普遍了解.所以在做了我自己的研究之后,我将把我的实现分享给我提供的上述JSON示例,希望它可以节省别人的时间.以下是我遵循的步骤:

>在我的Flutter项目中,首先我导入了以下库:

dependencies:

built_value: ^1.0.1
built_collection: ^1.0.0

dev_dependencies:

build_runner: ^0.3.0
built_value_generator:^1.0.1

>我创建了一个名为tool的文件夹.在其中,我放了2个文件:build.dart和watch.dart.这些文件的实现如下所示

build.dart

// copyright (c) 2015,Google Inc. Please see the AUTHORS file for details.
// All rights reserved. Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

import 'dart:async';

import 'package:build_runner/build_runner.dart';
import 'package:built_value_generator/built_value_generator.dart';
import 'package:source_gen/source_gen.dart';

/// Example of how to use source_gen with [BuiltValueGenerator].
///
/// Import the generators you want and pass them to [build] as shown,/// specifying which files in which packages you want to run against.
Future main(List<String> args) async {
  await build(
      new PhaseGroup.singleAction(
          new GeneratorBuilder([new BuiltValueGenerator()]),new InputSet('built_value_example',const [
            'lib/model/*.dart','lib/*.dart',])),deleteFilesByDefault: true);
}

watch.dart

// copyright (c) 2016,Google Inc. Please see the AUTHORS file for details.
// All rights reserved. Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

import 'dart:async';

import 'package:build_runner/build_runner.dart';
import 'package:built_value_generator/built_value_generator.dart';
import 'package:source_gen/source_gen.dart';

/// Example of how to use source_gen with [BuiltValueGenerator].
///
/// This script runs a watcher that continuously rebuilds generated source.
///
/// Import the generators you want and pass them to [watch] as shown,/// specifying which files in which packages you want to run against.
Future main(List<String> args) async {
  watch(
      new PhaseGroup.singleAction(
          new GeneratorBuilder([new BuiltValueGenerator()]),'lib/*.dart'])),deleteFilesByDefault: true);
}

>我创建了一个serializers.dart文件,它将我的json字符串序列化为我的自定义dart对象,以及我的模型对象person.dart

serializers.dart

library serializers;

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

part 'serializers.g.dart';

Serializers serializers = (
    _$serializers.toBuilder()..addplugin(new StandardJsonPlugin())
).build();

person.dart

library person;

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

part 'person.g.dart';

abstract class Person implements Built<Person,PersonBuilder> {
  String get name;
  int get age;
  BuiltList<Car> get cars;

  Person._();
  factory Person([updates(PersonBuilder b)]) = _$Person;
  static Serializer<Person> get serializer => _$personSerializer;
}

abstract class Car implements Built<Car,CarBuilder> {
  String get name;
  BuiltList<String> get models;

  Car._();
  factory Car([updates(CarBuilder b)]) = _$Car;
  static Serializer<Car> get serializer => _$carSerializer;
}

>创建上面的4个文件后,它将显示一些编译器错误.不要介意他们.这是因为build.dart文件尚未运行.因此,在此步骤中,运行build.dart.如果您正在使用Webstorm,只需右键单击build.dart并点击“Run build.dart”即可.这将创建2个文件:“person.g.dart”和“serializers.g.dart”.如果您仔细注意,在我们的build.dart文件中,我们将’lib / model / .dart’和’lib / .dart’放在一起.构建通过遍历指定的路径知道在哪里查找这些文件,并查找包含部分“内容”的文件.因此,在运行build.dart文件之前,将该行保留在这些文件中非常重要
>最后,现在我可以在main.dart文件中使用序列化程序将json字符串序列化为我的自定义dart对象类Person.在我的main.dart中,我在initState()中添加了以下代码

main.dart

Person _person;

  @override
  void initState() {
    super.initState();
    String json = "{"
        "\"name\":\"John\",\"age\":30,\"cars\": "
        "["
        "{ \"name\":\"Ford\",\"models\":[ \"Fiesta\",\"Focus\",\"Mustang\" ] },"
        "{ \"name\":\"BMW\",\"models\":[ \"320\",\"X3\",\"X5\" ] },"
        "{ \"name\":\"Fiat\",\"models\":[ \"500\",\"Panda\" ] }"
        "]}";

    setState(() {
      _person = serializers.deserializeWith(
          Person.serializer,JSON.decode(json));
    });
  }

我的示例项目也可以在Github Built value sample project上获得

对Flutter中的对象进行JSON序列化和反序列化的更多相关文章

  1. ios – Xcode 5持续集成CodeSign失败

    嗨,您好.我正在尝试使用xcode5和OSXServer为我的iOS应用程序配置持续集成.我将证书和p12添加到系统KeyChain,我还将配置文件复制到配置文件的服务器文件夹.集成失败,日志显示错误消息短消息:Command/usr/bin/codesignFailedwithexitcode1完整信息:CodeSign/Library/Server/Xcode/Data/BotRuns/Cac

  2. ios – Swift 2.0 – Google Analytics事件构建器错误 – NSMutableDictionary无法转换为[NSObject:AnyObject]

    完美地使用Swift1.2代码:错误:任何的想法?解决方法你错了你的事件.这是正确的方法和一种方法.将事件跟踪器初始化为NSObject在发送方法中将NSObject转换为Anyobject.

  3. ios – 如何存档包含自定义框架的应用程序?

    我有一个我创建的xcode框架项目,我可以编译成一个myframework.framework文件.编译之后,我将这个框架拖到我应用程序的Frameworks项目文件夹中,然后利用框架中的类,将适当的import语句添加到需要它的任何类;这允许我的应用程序成功编译与在框架中定义的类的引用.要使应用程序成功部署到我的设备,我还将我的自定义框架添加到我的目标的“嵌入式二进制文件”部分.有了这一切,我可

  4. ios – 1个用于体系结构x86_64的重复符号

    我不确定我做错了什么.我将项目文件夹移动到另一个文件夹,并将备份文件夹复制到桌面.我试图打开备份项目并构建,我收到了链接器错误.所以我决定删除备份文件夹并将项目文件夹移回桌面.我不能再编译并收到以下错误.没有派生数据文件夹还是一样1.我打开了DerivedData文件夹并删除了其中的所有内容2.我删除了所有模拟器中的所有项目3.我重新启动了xCode,Clean和build还是一样将项目添加到Gi

  5. ios – 链接错误/ Build / Products / Debug-iphonesimulator文件未找到

    我有Xcode的问题,不断给我一个链接器错误,它不构建项目.以下是我得到的错误ld:filenotfound:/Users/someuser/Library/Developer/Xcode/DerivedData/MAR-akbwbarcniqxytctbebckkelkbxs/Build/Products/Debug-iphonesimulator/MAR.app/MARclang:error:

  6. iOS 64位兼容性

    我的构建设置如下所示:我的部署目标是iOS6.0.我只需要确认该应用程序是64位兼容的,我都是iOS新手,不久前接管了一个相当大的项目,所以我宁愿要求100%肯定.只是为了使事情变得更清楚,你如何确保iOS应用程序是64位兼容的?

  7. xcode – 苹果LLVM编译3.1错误

    只需更新Xcode到4.3,现在我无法建立我的应用程序.我收到这个错误:有人有这个问题吗?

  8. RubyMotion Build:错误!找不到名为`(?-mix:iOS Team Provisioning Profile)’的配置配置文件

    我正在尝试构建一个简单的RubyMotion应用程序,以便我可以在我的iPhone上传输.我执行了rakebuild:device关于这个错误的任何想法?你应该做这个:InordertosuccessfullyrunaRubyMotionapponanon-jailbrokeniPhone3GSIhadto:DeletealloftheexpiredprovisioningprofilesintheMacOSXKeychainAccessapp.Yeah,mypastislitteredwithmanyr

  9. ios – Apple Mach-O Linker&amp;Ditto Error – Xcode 8

    解决方法>退出Xcode>重新启动系统>选择Xcode–>优先.这将打开一个弹出窗口.选择“位置”.在位置中,您将看到“派生数据”.点击路径旁边的箭头图标.这将打开一个包含“派生数据”的文件夹,将其删除.>清洁产品并运行

  10. xcode – 在Mac上使用OpenGL ES功能

    我试图将opengl绘制到2d空间,并且正在执行以下操作,但它不会编译:我已经包含了OpenGL.framework框架,编译器跟踪说明如下.我已经没有关于如何解决它的想法.我的目标是目前的桌面应用程序,但我的目标是最终制作一个iPhone应用程序.解决方法你有没有包含适当的标题?在Mac上,这些是可能在iPhone上他们是另外,如果我没弄错的话,glOrthof()是特定于OpenGL-ES的.您可能需要在Mac上使用glOrtho().

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部