Flutter toJson 缺少分号

Flutter toJson missing semicolon

我有以下型号 class。

@JsonSerializable()
class Login {
  String? userName;
  String? password;

  Login({required this.userName, required this.password});

  factory Login.fromJson(Map<String, dynamic> json) => _$LoginFromJson(json);
  Map<String, dynamic> toJson() => _$LoginToJson(this);
}

生成零件文件。

Login _$LoginFromJson(Map<String, dynamic> json) => Login(
      userName: json['userName'] as String?,
      password: json['password'] as String?,
    );

Map<String, dynamic> _$LoginToJson(Login instance) => <String, dynamic>{
      'userName': instance.userName,
      'password': instance.password,
    };

当我尝试将其用于 post 至 api 时,请遵循以下代码

  Future<void> loginUser(Login login) async => {
        print(login.toJson().toString());
}

打印语句的结果(导致转换错误)

{userName: test, password: password}

期望有效的 json 到 post 是

{
  "username": "string",
  "password": "string"
}

错误信息

Error: DioError [DioErrorType.other]: Converting object to an encodable object failed: Instance of '_HashSet<String>'

中删除=>
Future<void> loginUser(Login login) async => {
  print(login.toJson().toString());
}

Future<void> loginUser(Login login) async {
  print(login.toJson().toString());
}

在第一个例子中,它是一个箭头函数,其中括号 { } 代表一个集合文字,因为它就在箭头后面,很像生成的 _$LoginToJson 函数,但没有描述集合的类型。

在第二个例子中,它是一个普通函数,括号 { } 定义了函数体。

您可能希望调用 jsonEncode (import dart:convert;),它接受一个值,例如 Map<String, dynamic> 并将其转换为 [=40 中的 String =]格式。

更新打印语句如下:

print(jsonEncode(login.toJson()));

虽然生成的函数将对象解析为适合 JSON 的格式,但不会将其转换为实际的 String。您需要使用 jsonEncode 对其进行编码。同样,在处理 JSON 响应时,您需要 jsonDecode 响应主体以获得 Map<String, dynamic> 结构,然后您可以将其传递给生成的 fromJson 函数。