Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 什么';将Firebase中的数据序列化为Fatter的Dart对象的最佳方法是什么?_Json_Firebase_Flutter_Dart - Fatal编程技术网

Json 什么';将Firebase中的数据序列化为Fatter的Dart对象的最佳方法是什么?

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"

从Firebase序列化数据列表的最佳方式是什么?Firebase为对象提供了一个列表属性列表,这使得提出一种好的转换技术更具挑战性

您将如何从Firebase序列化此数据:

{
    "-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}.');