Dart中的JSON编码
我已经在我的颤振/飞镖应用程序中对JSON进行了解码/编码。解码工作得很好,但我在将对象编码为JSON时遇到了一个非常棘手的问题 这些是嵌套对象。它们中的每一个都有自己的toJson和fromJson方法,以确保jsonecode和Decode工作正常。我工作的一小部分:Dart中的JSON编码,json,flutter,dart,Json,Flutter,Dart,我已经在我的颤振/飞镖应用程序中对JSON进行了解码/编码。解码工作得很好,但我在将对象编码为JSON时遇到了一个非常棘手的问题 这些是嵌套对象。它们中的每一个都有自己的toJson和fromJson方法,以确保jsonecode和Decode工作正常。我工作的一小部分: class App { factory App.fromJson(Map<String, dynamic> json) => App( langPref: json["langP
class App {
factory App.fromJson(Map<String, dynamic> json) => App(
langPref: json["langPref"],
langFallb: json["langFallb"],
users: List.of(json["users"]).map((i) => i).toList(),
);
String langPref;
String langFallb;
List<User> users;
/// JSON-Export
Map<String, dynamic> toJson() => {
"langPref": langPref,
"langFallb": langFallb,
"users": jsonEncode(users),
};
}
但是,它看起来确实是这样的:
{
"langPref":"de-DE",
"langFallb":"en-GB",
"users":
[
{
"userid": 1
// and so on
{
"langPref":"de-DE",
"langFallb":"en-GB",
"users":"[{\"userid\":1
// and so on
因此,jsonEncode以某种方式引入了额外的双引号,这甚至在某种程度上是有意义的。它生成一个字符串,在JSON中应该对字符串进行编码。。。。但我觉得我只是做错了什么,错过了一些显而易见的事情。。。。如何让JSONECODE接受操作结果,而不是将其编码为字符串
有人能帮我吗?太好了。。。。我会回答我自己的问题。:-) 进一步的实验得出以下结论:
class App {
factory App.fromJson(Map<String, dynamic> json) => App(
langPref: json["langPref"],
langFallb: json["langFallb"],
users: List.of(json["users"]).map((i) => i).toList(),
);
String langPref;
String langFallb;
List<User> users;
/// JSON-Export
Map<String, dynamic> toJson() => {
"langPref": langPref,
"langFallb": langFallb,
"users": users,
};
}
class应用程序{
工厂App.fromJson(映射json)=>App(
langPref:json[“langPref”],
langFallb:json[“langFallb”],
users:List.of(json[“users”]).map((i)=>i.toList(),
);
字符串langPref;
字符串langFallb;
列出用户名单;
///JSON导出
映射到JSON()=>{
“langPref”:langPref,
“langFallb”:langFallb,
“用户”:用户,
};
}
新的只是最后一行。。。。我可以直接传递用户列表。没有必要对所有嵌套对象、列表和映射等使用JSONECODE
很抱歉占用了读者的时间,但是这个答案可能会帮助其他人。这个问题的出现是因为您使用了返回字符串对象的
jsonEncode()
必须使用返回映射的jsonDecode()
您的应用程序类将如下所示
class App {
factory App.fromJson(Map<String, dynamic> json) => App(
langPref: json["langPref"],
langFallb: json["langFallb"],
users: List.of(json["users"]).map((i) => i).toList(),
);
String langPref;
String langFallb;
List<User> users;
/// JSON-Export
Map<String, dynamic> toJson() => {
"langPref": langPref,
"langFallb": langFallb,
"users": jsonEDecode(users),
};
}
第四种方法最佳方法
使用library with library为注释类生成json序列化,
颤振团队批准此方法为中所述的最佳和正式方法
app.dart
import 'package:json_annotation/json_annotation.dart';
part 'app.g.dart';
@JsonSerializable()
class App{
String langPref;
String langFallb;
List<User> users;
App({this.langPref, this.langFallb, this.users});
factory App.fromJson(Map<String, dynamic> json) => _$AppFromJson(json);
Map<String, dynamic> toJson() => _$AppToJson(this);
}
import'package:json_annotation/json_annotation.dart';
“附件g.省道”部分;
@JsonSerializable()
类应用程序{
字符串langPref;
字符串langFallb;
列出用户名单;
App({this.langPref,this.langFallb,this.users});
factory App.fromJson(Map json)=>u$AppFromJson(json);
Map toJson()=>$AppToJson(此);
}
user.dart
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User{
int userId;
User({this.userId});
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
import'package:json_annotation/json_annotation.dart';
“用户g.dart”部分;
@JsonSerializable()
类用户{
int用户标识;
用户({this.userId});
factory User.fromJson(Map json)=>$UserFromJson(json);
映射到JSON()=>$UserToJson(此);
}
首先感谢您的回答。。。。嗯,更好的jsonDecode,就像你建议的,还是直接加入用户。。。。它在我的测试用例中工作,但也许你的解决方案更安全?我用其他3种方法更新了我的答案json序列化的最佳方法是第4种方法
import 'package:json_annotation/json_annotation.dart';
part 'app.g.dart';
@JsonSerializable()
class App{
String langPref;
String langFallb;
List<User> users;
App({this.langPref, this.langFallb, this.users});
factory App.fromJson(Map<String, dynamic> json) => _$AppFromJson(json);
Map<String, dynamic> toJson() => _$AppToJson(this);
}
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User{
int userId;
User({this.userId});
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}