原文链接

文档

import 'dart:convert';

main() async {
// json 转化为 map
String jsonStr = '''
[
{"name": "ajanuw"},
{"name": "suou"}
]
'''; var jsonObj = jsonDecode(jsonStr);
print(jsonObj[0]['name'] == 'ajanuw'); // true // list<Map> 转化为 json字符串
var scores = [
{'score': 40},
{'score': 80},
{'score': 100, 'overtime': true, 'special_guest': null}
];
var jsonText = jsonEncode(scores);
print(jsonText);
}

使用对象添加模板 JSON to Dart

import 'dart:convert';

class MyInfo {
MyInfo({this.age, this.name}); String name;
int age; factory MyInfo.fromJson(Map<String, dynamic> jsonMap) {
return MyInfo(
name: jsonMap['name'],
age: jsonMap['age'],
);
}
} main(List<String> args) {
String jsonStr = '''
{
"name": "ajanuw",
"age": 12
}
''';
var parsed = jsonDecode(jsonStr);
MyInfo data = MyInfo.fromJson(parsed);
print(data.age);
}

使用“built_value”库来处理json

我在这里使用"stagehand console-full"创建的项目示例,项目名叫"dart_test"

1) 安装依赖

dependencies:
...
built_value:
built_collection: dev_dependencies:
...
build_runner:
built_value_generator:
  1. 准备json数据
{
"id": 157538,
"date": "2017-07-21T10:30:34",
"date_gmt": "2017-07-21T17:30:34",
"type": "post",
"link": "https://example.com",
"title": {
"rendered": "Json 2 dart built_value converter"
},
"tags": [
1798,
6298
]
}
  1. 创建文件"lib/models/hello.dart",文件名很重要必须要要和你的class名一样
import 'dart:convert';

import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart'; part 'hello.g.dart'; abstract class Hello implements Built<Hello, HelloBuilder> {
Hello._(); factory Hello([updates(HelloBuilder b)]) = _$Hello; @BuiltValueField(wireName: 'id')
int get id;
@BuiltValueField(wireName: 'date')
String get date;
@BuiltValueField(wireName: 'date_gmt')
String get dateGmt;
@BuiltValueField(wireName: 'type')
String get type;
@BuiltValueField(wireName: 'link')
String get link;
@BuiltValueField(wireName: 'title')
Title get title; @nullable // 可为空,返回null
@BuiltValueField(wireName: 'tags')
BuiltList<int> get tags; String toJson() {
return jsonEncode(serializers.serializeWith(Hello.serializer, this));
} static Hello fromJson(String jsonString) {
return serializers.deserializeWith(
Hello.serializer, jsonDecode(jsonString));
} static Serializer<Hello> get serializer => _$helloSerializer;
} abstract class Title implements Built<Title, TitleBuilder> {
Title._(); factory Title([updates(TitleBuilder b)]) = _$Title; @BuiltValueField(wireName: 'rendered')
String get rendered; String toJson() {
return jsonEncode(serializers.serializeWith(Title.serializer, this));
} static Title fromJson(String jsonString) {
return serializers.deserializeWith(
Title.serializer, jsonDecode(jsonString));
} static Serializer<Title> get serializer => _$titleSerializer;
}
  1. 保存文件后,在项目根目录下运行命令, 生成"lib/models/hello.g.dart"文件
flutter packages pub run build_runner build   // 执行一次build命令
flutter packages pub run build_runner watch // 文件更改自动build
flutter packages pub run build_runner watch --delete-conflicting-outputs // 删除旧文件在build
  1. 创建"lib/models/serializers.dart"文件,编写下面的代码后,保存会生成"lib/models/serializers.g.dart"文件
import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
import 'package:dart_test/models/hello.dart'; part 'serializers.g.dart'; @SerializersFor(const [
Hello
])
final Serializers serializers = (_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
  1. 编写“bin/main.dart"
import 'package:dart_test/models/hello.dart';

String jsonStr = '''
{
"id": 157538,
"date": "2017-07-21T10:30:34",
"date_gmt": "2017-07-21T17:30:34",
"type": "post",
"link": "https://example.com",
"title": {
"rendered": "Json 2 dart built_value converter"
},
"tags": [
1798,
6298
]
}
'''; main(List<String> args) {
Hello hello = Hello.fromJson(jsonStr);
print(hello.title.rendered);
print(hello.tags.length);
}
  1. 保存文件后执行
> dart bin/main.dart
Json 2 dart built_value converter
2

在vscode中隐藏 “*.g.dart”生成的文件

  "files.exclude": {
"**/*.g.dart": true
}

built_value处理json不要有这样的数据 { key: [[{}], [{}],...] } 转换为这样: { key: [{key: []}, {key: []},...] }

创建枚举

  int get age;
TypeStatus get type => age < 10 ? TypeStatus.a : TypeStatus.b; enum TypeStatus {
a,
b,
}
// or
class TypeStatus extends EnumClass {
static const TypeStatus a = _$a;
static const TypeStatus b = _$b;
const TypeStatus._(String name) : super(name);
static BuiltSet<TypeStatus> get values => _$values;
static TypeStatus valueOf(String name) => _$valueOf(name);
}

手动创建dto模型

import 'dto/hello_dto/hello_dto.dart';

String jsonStr = '''
{
"id": 157538,
"date": "2017-07-21T10:30:34",
"date_gmt": "2017-07-21T17:30:34",
"type": "post",
"link": "https://example.com",
"title": {
"rendered": "Json 2 dart built_value converter"
},
"tags": [
1798,
6298
]
}
'''; main(List<String> args) {
var r = HelloDto(
(b) => b
..id = 1
..date = 'date'
..dateGmt = 'dateGmt'
..type = 'get'
..link = 'link'
..title.rendered = 'title'
..tags.addAll([1, 2]),
); print(r);
}
λ dart test.dart
HelloDto {
id=1.0,
date=date,
dateGmt=dateGmt,
type=get,
link=link,
title=TitleDto {
rendered=title,
},
tags=[1, 2],
arrobj=[],
}

rebuild重建实例

  var hello = HelloDto.fromJson(jsonStr);
var hello2 = hello.rebuild((b) => b.type = 'get');
print(hello == hello2); // false // 数据一样是相等的
var hello = HelloDto.fromJson(jsonStr);
var hello2 = HelloDto.fromJson(jsonStr);
print(hello == hello2); // true

在flutter中更新数据

import 'package:flutter/material.dart';
import 'package:flutter_demo/dto/hello_dto/hello_dto.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
} class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
} class _HomePageState extends State<HomePage> {
List<HelloDto> data; @override
void initState() {
super.initState(); data = HelloDto.fromListJson('''[{"a":"a1","b":"b1"},{"a":"a2","b":"b2"}]''');
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Page'),
),
body: ListView(
children: <Widget>[
for (var it in data)
ListTile(
title: Text(it.a),
subtitle: Text(it.b),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
data[0] = data[0].rebuild((b) => b.a = 'new title');
});
},
child: Icon(Icons.hot_tub),
),
);
}
}

为可能为null的数据设置默认值

  @nullable
@BuiltValueField()
int get id; static HelloDto fromJson(String jsonString) {
return serializers
.deserializeWith(HelloDto.serializer, jsonDecode(jsonString))
.rebuild(
// 在这里设置
(b) => b..id ??= 0,
);
}
  var hello = HelloDto.fromJson('{"id": null}');
print(hello);
print(hello.id); //=> 0

Dart 处理json,built_value库的更多相关文章

  1. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

  2. fastjson是阿里巴巴的开源JSON解析库

    fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}&q ...

  3. python 中的json解析库

    当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...

  4. Tomjson - json 解析库

    Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...

  5. Delphi语言最好的JSON代码库 mORMot学习笔记1

    mORMot没有控件安装,直接添加到lib路径,工程中直接添加syncommons,syndb等到uses里 --------------------------------------------- ...

  6. C++的Json解析库:jsoncpp和boost

    C++的Json解析库:jsoncpp和boost - hzyong_c的专栏 - 博客频道 - CSDN.NET C++的Json解析库:jsoncpp和boost 分类: 网络编程 开源库 201 ...

  7. Java JSON处理库Jackson

    Jackson是一款为Java平台提供的一套数据处理类库工具,Jackson的主要功能是提供JSON解析和生成.另外,Jackson还提供额外的类库以支持处理Avro, CBOR, CSV, Smil ...

  8. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

    Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...

  9. C++的Json解析库:jsoncpp和boost(转)

    原文转自 http://blog.csdn.net/hzyong_c/article/details/7163589 JSON(JavaScript Object Notation)跟xml一样也是一 ...

随机推荐

  1. python基础学习2 函数变量与赋值

    学习的第一步,就是通常的输出函数:print() 1.基础主要学习了变量的赋值,变量名可以疑字母.数字.下划线(_)进行命名,但是不能以数字开头 变量的赋值:变量名 = 变量值 2.模块的导入,和调用 ...

  2. JVM 参数的设置及解析

    JVM 参数的设置及解析 1.关于JVM配置: 2.Linux JVM设置: 1.关于JVM配置: 设置jvm内存的参数有四个: -Xmx 设置堆(Java Heap)最大值,默认值为物理内存的1/4 ...

  3. postfix “ Sender address rejected: not logged in”

      一.问题 先说一下问题,我们公司有两台邮件服务器,分别是不同的域名但是用的是同一个用户认证,最近老有人反应说,有匿名邮件就是通过类似这种网站,进行使用你们公司的SMTP邮件服务器进行发送垃圾邮件 ...

  4. java中的IO处理和使用,API详细介绍(一)

    写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...

  5. PyQt中ui编译成窗体.py,中文乱码

    我在Eric工具下编译的 解决办法: 1.打开 C:\Python27\Lib\site-packages\eric4\i18n,将中文资源包的名称"GB2312."去掉,变成er ...

  6. 黑客练手入门| pwnable.kr—幼儿瓶—01:fd

    目录 前言 pwnable.kr介绍 该怎么玩 幼儿瓶第一道题:fd 0x00 问题描述 0x01 源码分析 0x02 解题方法 0x03 知识点总结 前言 担心有人不知道pwnable.kr是什么, ...

  7. 使用TCP发送文件

    客户端 package com.zy.demo3; import java.io.File; import java.io.FileInputStream; import java.io.IOExce ...

  8. Codeforces Round #682 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1438 A. Specific Tastes of Andre 题意 构造一个任意连续子数组元素之和为子数组长度倍数的数组. ...

  9. A. Little Pony and Expected Maximum

    Twilight Sparkle was playing Ludo with her friends Rainbow Dash, Apple Jack and Flutter Shy. But she ...

  10. Educational Codeforces Round 89 (Rated for Div. 2)D. Two Divisors 线性筛质因子

    题目链接:D:Two Divisors 题意: 给你n个数,对于每一个数vi,你需要找出来它的两个因子d1,d2.这两个因子要保证gcd(d1+d2,vi)==1.输出的时候输出两行,第一行输出每一个 ...