Flutter中JSON序列化和反序列化为对象

2024-03-22

由于 Flutter 从其 SDK 中删除了 dart: 镜像,因此不再可能使用 dartson 等库进行 JSON 对象序列化/反序列化。不过,我读到built_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 项目中,首先我导入了以下库:

依赖项:

内置值:^1.0.1
内置集合:^1.0.0

开发依赖项:

构建运行者:^0.3.0
内置值生成器:^1.0.1

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

构建.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);
}

手表.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()]),
          new InputSet('built_value_example', const [
            'lib/model/*.dart',
            'lib/*.dart'])),
      deleteFilesByDefault: true);
}
  • 我创建了一个 serializers.dart 文件,它将我的 json 字符串序列化为我的自定义 dart 对象,以及我的模型对象 person.dart

序列化器.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 并点击“运行 build.dart”即可。这将创建 2 个文件:“person.g.dart”和“serializers.g.dart”。如果你仔细注意到,在我们的 build.dart 文件中,我们放置了 'lib/model/.dart' 和 'lib/。镖'。构建知道通过指定的路径在哪里查找这些文件,并查找包含“某物”部分的文件。因此,在运行 build.dart 文件之前将该行保留在这些文件中非常重要

  • 最后,现在我可以使用 main.dart 文件中的序列化器将 json 字符串序列化为我的自定义 dart 对象类 Person。在我的 main.dart 中,我在 initState() 中添加了以下代码

主程序.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 上找到建成价值样本项目 https://github.com/toufikzitouni/Built-Value-Example

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter中JSON序列化和反序列化为对象 的相关文章

随机推荐

  • VSCode 1.14.0 7月更新有重大问题:如何回滚?

    因此 新的 VSCode 更新版本 1 14 0 会导致以下主要问题 CPU 使用率高 导致冻结 随机崩溃 扩展不可用 IntelliSense 工作一半时间 所以我的问题是如何将 VSCode 回滚到以前的版本而不丢失我的配置 1 14
  • 如何测试放置在子文件夹中的 django 应用程序?

    我在测试分组在子文件夹中的 django 应用程序时遇到问题 好吧 让我解释一下情况 标准 django 项目结构如下所示 django project appname1 appname2 appname3 lib tests docs s
  • 将 NSColor 转换为 RGB

    我正在尝试将 NSColor 转换为 RGB 但它似乎给出了完全错误的结果 NSColor testColor NSColor colorWithCalibratedWhite 0 65 alpha 1 0 const CGFloat co
  • 输入类型提交与输入类型按钮

    我一直在尝试用 PHP 解决一个恼人的行为 我认为 也许你们中的一些人也遇到过同样的情况并有一些想法 我有一个 html 表单 并且使用一个带有 onClick 事件的元素来调用 javascript 函数 处理脚本的内容后 我执行 for
  • 可以更换大开关吗?

    我有一个名为 ReportController aspx 的页面 其目的是根据查询字符串参数实例化报告 类 switch Request QueryString Report case ReportA CreateReportAReport
  • Matplotlib rcparams (autolimit_mode) 用于单个图形

    我对新的 Matplotlib 2 0 0 有疑问 默认情况下 新的 autolimit mode 值会向框架添加填充 我想避免它变成一个数字 如果我更改 rcParams 则更改会影响任何生成的图形 我可以更改单个图形的此参数而不影响其余
  • 通过公式而不是脚本在单元格中使用 Google Sheets 文件名?

    有没有FORMULA这将在单元格中显示文件的名称 我找到了可以做到这一点的脚本 可以显示工作表名称的公式 但没有找到可以显示文件名的公式 如果我必须诉诸剧本 那就这样吧 但如果可能的话我想使用公式 如果以前有人问过这个问题 请指出该帖子 我
  • Object.values() 的替代版本

    我正在寻找替代版本Object values 功能 As 此处描述 https developer mozilla org en US docs Web JavaScript Reference Global Objects Object
  • 以数组形式遍历不平衡二叉树

    不平衡 或非堆 二叉树可以使用数组表示 如下所示 array 1 2 null 3 4 5 6 null 7 8 null 1 2 null 3 4 5 6 null 7 8 null 如何使用给定的数组进行树遍历 更具体地说 如何计算父母
  • 如何在颤振中的当前位置创建圆圈

    我正在开发 flutter 项目 我必须在谷歌地图上的当前位置上画一个圆圈 有人知道吗 我想要这样的颤振 提前致谢 此功能现已在 google maps flutter 包中提供 https pub dev documentation go
  • 使用facet_wrap和geom_segment删除不必要的y轴点

    我使用以下命令将 y 轴点映射到 x 轴geom segment 然后使用facet wrap将数据分成两个图 然而 y 轴点都显示在这两个图上 我怎样才能只拥有与每个相关的必要的 y 轴点facet wrap 示例代码 dat lt st
  • 无法调整图表边距

    我创建了一个图表 但它在 Y 轴和图表边框之间有一个左边距 我怎样才能让它变成0 是否可以在图表和边框之间定义 5px 的统一边距 左 上 右 下 我的图表代码如下 Chart chart new Chart AntiAliasing An
  • 使用 ObjectInputStream 读取文件时出现 EOFException [重复]

    这个问题在这里已经有答案了 我基本上有一个类似的问题 如此处所述 Java中读取objectinputstream时出现EOF异常 https stackoverflow com q 2308128 1065197 但我找不到干净代码的答案
  • jQuery 1.4.1 中缺少 JSON stringify?

    显然 jQuery 能够将给定的对象或字符串解码为 JSON 对象 但是 我有一个 JS 对象 需要将其 POST 回服务器 并且我在 jQuery 中找不到包装 JSON stringify 函数的实用程序 Chrome Safari 4
  • 在运行时改变对象的行为

    如何在运行时更改对象的行为 使用C 我举一个简单的例子 我有课Operator包含一个方法operate 让我们假设它看起来像这样 double operate double a double b return 0 0 用户将给出一些输入值
  • ASP.NET MVC 模型与表单元素名称中的破折号绑定

    我一直在互联网上搜索 试图找到一种方法 将表单元素中的破折号容纳到 MVC 2 3 甚至 4 中 ASP NET 控制器的默认模型绑定行为中 作为一名前端开发人员 我更喜欢 CSS 中的破折号 而不是驼峰命名法或下划线 在我的标记中 我想要
  • 客户无需离开您的网站即可使用 Paypal 进行付款

    我的客户给我这个链接https www paypal com webapps mpp compare business products https www paypal com webapps mpp compare business p
  • 使用任务时出现意外的线程中止异常。为什么?

    我有一个在应用程序域中运行的控制台应用程序 应用程序域由自定义 Windows 服务启动 该应用程序使用父任务来启动多个有效的子任务 当计时器寻找新工作时 在任何给定时间都可能有许多父任务和子任务一起运行 所有父任务的句柄位于任务列表中 s
  • 我必须实现哪些方法才能重新排列 UITableView 行?

    对于使用名为 rows 的字符串 NSMutableArray 的简单示例 我必须在表控制器中实现什么才能移动 tableView 行并将更改反映在我的数组中 我们在这里做繁重的工作 void tableView UITableView t
  • Flutter中JSON序列化和反序列化为对象

    由于 Flutter 从其 SDK 中删除了 dart 镜像 因此不再可能使用 dartson 等库进行 JSON 对象序列化 反序列化 不过 我读到built value 是实现类似目的的另一种方法 我找不到任何关于如何实现它的好例子 因