Dart中的JSON编码

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

我已经在我的颤振/飞镖应用程序中对JSON进行了解码/编码。解码工作得很好,但我在将对象编码为JSON时遇到了一个非常棘手的问题

这些是嵌套对象。它们中的每一个都有自己的toJson和fromJson方法,以确保jsonecode和Decode工作正常。我工作的一小部分:

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