Json 什么';将Firebase中的数据序列化为Fatter的Dart对象的最佳方法是什么?
从Firebase序列化数据列表的最佳方式是什么?Firebase为对象提供了一个列表属性列表,这使得提出一种好的转换技术更具挑战性 您将如何从Firebase序列化此数据:Json 什么';将Firebase中的数据序列化为Fatter的Dart对象的最佳方法是什么?,json,firebase,flutter,dart,Json,Firebase,Flutter,Dart,从Firebase序列化数据列表的最佳方式是什么?Firebase为对象提供了一个列表属性列表,这使得提出一种好的转换技术更具挑战性 您将如何从Firebase序列化此数据: { "-KiRg_F-qC59xxlfZ6ej": { "first":"Brandon", "last":"Donnelson" }, "-KiRgmsISBsJSWfXhrdD": { "first":"Danny", "last"
{
"-KiRg_F-qC59xxlfZ6ej": {
"first":"Brandon",
"last":"Donnelson"
},
"-KiRgmsISBsJSWfXhrdD": {
"first":"Danny",
"last":"Kirk"
}
}
我想到了什么-请参见\u loadData()
)-:
导入'dart:convert';
进口“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
void main(){
runApp(新的MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“颤振演示”,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(widget.title),
),
正文:新中心(
儿童:新文本(
“点击”,
),
),
floatingActionButton:新的floatingActionButton(
按下按钮:_测试,
工具提示:“增量”,
子:新图标(Icons.add),
),);
}
void_测试(){
_loadData();
}
_loadData()异步{
字符串url='0https://dev-xxxxxxx.firebaseio.com/names.json';
var httpClient=createHttpClient();
var response=wait-httpClient.read(url);
打印('响应='+响应);
//答复={
//“-KiRg_F-qC59xxlfZ6ej:{“第一个”:“布兰登”,“最后一个”:“唐纳森”},
//“-KiRgmsISBsJSWfXhrdD”:{“第一个”:“丹尼”,“最后一个”:“柯克”}
// }
NamesData NamesData=新的NamesData(JSON.decode(response));
打印(“names.len=“+namesData.names.length.toString());
}
}
类名称数据{
最终列表名称=新列表();
名称数据(地图数据){
data.values.forEach((Map-Map)=>names.add(newnamedata.fromJson(Map));
}
}
类名数据{
先串;
最后一串;
NameData.fromJson(映射){
first=映射['first'];
last=映射['last'];
}
}
我发现JSON解码器有一种更好的方法,可以使用reviver函数实例化类。这感觉好多了,但我想我可以做得更好
\u loadData()异步{
字符串url='0https://dev-xxxxxxx.firebaseio.com/names.json';
var httpClient=createHttpClient();
var response=wait-httpClient.read(url);
打印('响应='+响应);
//答复={
//“-KiRg_F-qC59xxlfZ6ej:{“第一个”:“布兰登”,“最后一个”:“唐纳森”},
//“-KiRgmsISBsJSWfXhrdD”:{“第一个”:“丹尼”,“最后一个”:“柯克”}
// }
var extendedJson=新的JsonCodec(恢复者:_恢复者);
var o=extendedJson.decode(响应);
打印(“结束”);
}
// https://github.com/dart-lang/sdk/blob/master/tests/lib/convert
///json\u toEncodable\u revivier\u test.dart
_复活器(键、值){
如果(value!=null&&value是Map&&key.toString()包含(“-”)){
返回新的NameData2(值);
}
返回值;
}
}
类名Data2{
先串;
最后一串;
NameData2(地图){
first=映射['first'];
last=映射['last'];
}
}
我个人喜欢写一个小小的编解码器
有时:
导入'dart:convert';
void main(){
最终解码器=常量FirebaseNamesDecoder();
打印(解码器.转换(例如FireBaseData));
}
类名数据{
最终字符串id;
最后一个字符串名;
最后一个字符串lastName;
const NamedData(this.id、this.firstName、this.lastName);
@凌驾
字符串toString()=>“$NamedData{$id:$firstName$lastName}”;
}
类FirebaseNamesDecoder扩展了转换器{
常量FirebaseNamesDecoder();
@凌驾
Iterable转换(映射原始){
返回raw.keys.map((id)=>newnameddata(id,raw[id]['first'],raw[id]['last']);
}
}
最后一个示例FirebaseData={
“-KiRg_F-qC59xxlfZ6ej”:{
“第一”:“布兰登”,
“last”:“Donnelson”
},
“-KiRgmsISBsJSWfXhrdD”:{
“第一”:“丹尼”,
“最后”:“柯克”
}
};
结果:
(
名称数据{-KiRg_F-qC59xxlfZ6ej:Brandon Donnelson},
NamedData{-KiRgmsISBsJSWfXhrdD:Danny Kirk}
)
Dart 2需要修改覆盖的方法:
Iterable<NamedData> convert(Map<dynamic,dynamic> raw) {
return raw.keys
.map((id) => new NamedData(id, raw[id]['first'], raw[id]['last']));
}
Iterable转换(映射原始){
返回原始密钥
.map((id)=>newnameddata(id,raw[id]['first'],raw[id]['last']);
}
使用dart:convert手动序列化JSON
颤振中的基本JSON序列化非常简单。颤振有一个内置的dart:convert库,其中包括一个简单的JSON编码器和解码器
以下示例JSON实现了一个简单的用户模型。
{"name":"John Smith","email":"john@example.com"}
使用dart:convert,可以通过两种方式序列化此JSON模型
1)序列化JSON内联
使用复活器似乎是从json解码的最佳方式。共享DartPad时出现问题,它是空的。使用转换器很好!
{"name":"John Smith","email":"john@example.com"}
Map<String, dynamic> user = jsonDecode(jsonString);
print('Howdy, ${user['name']}!');
print('We sent the verification link to ${user['email']}.');
class User
{
final Stringname;
final Stringemail;
User(this.name,this.email);
User.fromJson(Map<String,dynamic>json):name=json['name'],email=json['email'];
Map<String,dynamic>toJson()=>
{
'name':name,
'email':email,
};
}
Map userMap = jsonDecode(jsonString);
var user = User.fromJson(userMap);
print('Howdy, ${user.name}!');
print('We sent the verification link to ${user.email}.');