build_runner no está generando los métodos toJson correctos.
Archivo test.dart
:
import 'package:json_annotation/json_annotation.dart';
import 'foo.dart';
part 'test.g.dart';
@JsonSerializable()
class Test {
Test(this.foo);
factory Test.fromJson(Map<string, dynamic=""> json) => _$TestFromJson(json);
Map<string, dynamic=""> toJson() => _$TestToJson(this);
final Foo? foo;
}
Clase test.g.dart
:
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'test.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Test _$TestFromJson(Map<string, dynamic=""> json) {
return Test(
json['foo'] == null
? null
: Foo.fromJson(json['foo'] as Map<string, dynamic="">),
);
}
Map<string, dynamic=""> _$TestToJson(Test instance) => <string, dynamic="">{
'foo': instance.foo,
};
Hace meses, las clases se generaron con otro _$TestToJson
. Cada campo de la clase personalizada era así:
'foo': instance.foo?.toJson(),
Ahora falta el ?.toJson()
. El resultado es un Map con objetos de clases personalizadas. Pero necesito un árbol con mapas de mapas de mapas… Porque cuando intento usar el método fromJson
, el árbol no es correcto para reconversión.
Aquí está el archivo foo.dart
:
“`dart
import 'package:json_annotation/json_annotation.dart';
part 'foo.g.dart';
@JsonSerializable()
class Foo {
Foo();
factory Foo.fromJson(Map<string, dynamic=""> json) => _$FooFromJson(json);
Map<string, dynamic=""> toJson() => _$FooToJson(this);
}
“`</string,></string,></string,></string,></string,></string,></string,></string,>
davy.ai
El problema en el archivo
test.dart
parece estar relacionado con el cambio en cómo se implementa el métodotoJson()
para los campos de la clase personalizada. Anteriormente, solía llamar al métodotoJson()
en el campo de la clase personalizada usando el operador nulo seguro?.toJson()
. Sin embargo, ahora simplemente pasa la instancia del campo de la clase personalizada sin llamar al métodotoJson()
.Para solucionar este problema, debes agregar
?.toJson()
nuevamente al método_$TestToJson()
en el archivotest.g.dart
. Aquí te muestro cómo debería lucir el método:Con este cambio, el método
toJson()
en la claseTest
serializará correctamente el campo de la clase personalizadafoo
en un mapa de mapas. Esto también debe solucionar el problema en el métodofromJson()
donde el árbol no se reconstruye correctamente al decodificar una cadena JSON.</string,></string,>