原文链接

文档

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. 在Centos7上安装Python+Selenium+Firefox+Geckodriver

    1.事先准备好Centos7的系统 Centos系统是CentOS Linux release 7.4.1708 (Core) 查看Centos内核版本命令cat /etc/centos-releas ...

  2. Spring听课笔记(专题一)

    Spring入门课程:https://www.imooc.com/learn/196 第0章: Spring是为解决企业应用程序开发复杂性而创建的一个Java开源框架,应用非常广泛.业内非常流行的SS ...

  3. (一)在Spring Boot应用启动之后立刻执行一段逻辑

    在Spring Boot应用启动之后立刻执行一段逻辑 1.CommandLineRunner 2.ApplicationRunner 3.传递参数 码农小胖哥:如何在Spring Boot应用启动之后 ...

  4. 6. Linux输入输出重定向

    1.输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中. 输入重定向中用到的符号及其作用 输出重定向中用到的符号及其作用 1)通过输出重定向将原本要输出到 ...

  5. apache 创建多端口监听

    httpd.conf 将 #LoadModule vhost_alias_module modules/mod_vhost_alias.so 改为 LoadModule vhost_alias_mod ...

  6. 2018 ACM-ICPC 焦作区域赛 E Resistors in Parallel

    Resistors in Parallel Gym - 102028E 吐槽一下,网上搜索的题解一上来都是找规律,对于我这种对数论不敏感的人来说,看这种题解太难受了,找规律不失为一种好做法,但是题解仅 ...

  7. Codeforces Global Round 9 C. Element Extermination

    题目链接:https://codeforces.com/contest/1375/problem/C 题意 给出一个大小为 $n$ 的排列 $a$,如果 $a_i < a_{i+1}$,则可以选 ...

  8. Educational Codeforces Round 90 (Rated for Div. 2) D. Maximum Sum on Even Positions(dp)

    题目链接:https://codeforces.com/contest/1373/problem/D 题意 给出一个大小为 $n$ 的数组 $a$,下标为 $0 \sim n - 1$,可以进行一次反 ...

  9. Codeforces Round #627 (Div. 3) A - Yet Another Tetris Problem(逻辑)

    题意 : 有n个高度,可以使任一高度加二任意次,问最终n个高度可否相同. 思路: 因为添加的2x1的方块不可旋转,只需考虑所有高度是否为同一奇偶性即可. #include <bits/stdc+ ...

  10. - Visible Trees HDU - 2841 容斥原理

    题意: 给你一个n*m的矩形,在1到m行,和1到n列上都有一棵树,问你站在(0,0)位置能看到多少棵树 题解: 用(x,y)表示某棵树的位置,那么只要x与y互质,那么这棵树就能被看到.不互质的话说明前 ...