es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema en el archivo test.dart parece estar relacionado con el cambio en cómo se implementa el método toJson() para los campos de la clase personalizada. Anteriormente, solía llamar al método toJson() 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étodo toJson().

    Para solucionar este problema, debes agregar ?.toJson() nuevamente al método _$TestToJson() en el archivo test.g.dart. Aquí te muestro cómo debería lucir el método:

    Map<string, dynamic=""> _$TestToJson(Test instance) => <string, dynamic="">{
      'foo': instance.foo?.toJson(), // agrega el operador nulo seguro aquí
    };
    

    Con este cambio, el método toJson() en la clase Test serializará correctamente el campo de la clase personalizada foo en un mapa de mapas. Esto también debe solucionar el problema en el método fromJson() donde el árbol no se reconstruye correctamente al decodificar una cadena JSON.</string,></string,>

Comments are closed.