gpt4 book ai didi

json - Dart中的JSON编码

转载 作者:行者123 更新时间:2023-12-03 04:35:17 25 4
gpt4 key购买 nike

我曾在Flutter / Dart应用程序中对JSON进行解码/编码。解码工作得很好,但是将对象编码为JSON时我遇到了一个非常讨厌的问题。
这些是嵌套对象。为了确保jsonEncode和Decode正常工作,它们每个都有其toJson和fromJson方法。我的工作的一小段内容:

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),
};
}
和嵌套类:
class User {
int userid;
// actually there's more, including more nested objects


/// JSON-Import
factory User.fromJson(Map<String, dynamic> json) {
return User(
userid: int.parse(json["userid"]),
);
}

/// JSON-Export
Map<String, dynamic> toJson() {
return {
"userid": this.userid,
};
}
}
问题是:当我对顶级类“App”进行编码时,它会正确调用嵌套类的toJson()方法。但是,相应的JSON应该如下所示:
{
"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内应该对字符串进行编码....但是我猜我只是做错了什么而错过了一些明显的事情....我怎样才能告诉jsonEncode接受操作的结果呢?编码为字符串?
有人可以帮我吗?

最佳答案

出现此问题的原因是您使用了返回字符串对象的jsonEncode()您必须使用jsonDecode()返回Map
您的App类将如下所示

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),
};
}
更新
第二种方法是不使用 jsonEncode()删除 jsonDecode() 第三种方法在用户类中使用 tojson()方法,例如以下代码
"users": users.map((user) => user.tojson()).toList(),
第四种方法 最佳方法
结合使用 json_serializable库和 json_annotation库为带注释的类生成json序列化,
Flutter小组批准此方法为 Official Flutter Documentation中所述的最佳方法和正式方法。
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);

}
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);
}

关于json - Dart中的JSON编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64234394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com