dart_easy_json 0.1.0
dart_easy_json: ^0.1.0 copied to clipboard
Ferramenta para facilitar a (de)serialização de objetos JSON.
easy_json #
Geração de fromJson/toJson/validate/*Safe com validação, fallback e issue tracking.
Instalação #
dependencies:
easy_json:
git:
url: https://github.com/llFurtll/easy_json.git
dev_dependencies:
build_runner: ^2.4.0
Gere os arquivos:
dart run build_runner build -d
Como usar (rápido) #
@EasyJson(caseStyle: CaseStyle.snake, includeIfNull: false)
class User with UserSerializer {
final String userName; // "user_name"
final DateTime createdAt; // "created_at"
@EasyKey(name: 'e_mail')
final String? email; // "e_mail"
}
Gerado (nomes podem variar):
User userFromJson(Map<String,dynamic> json)
Map<String,dynamic> userToJson(User instance)
List<EasyIssue> userValidate(Map<String,dynamic> json)
User userFromJsonSafe(Map<String,dynamic> json, {onIssue, runValidate=true})
O que cada método faz #
-
fromJsonConversão rápida. Lança erro em tipos inconsistentes (especialmente primitivos/enum/DateTime). Útil quando input é confiável. -
toJsonSerializa respeitandocaseStyleeincludeIfNull(ou@EasyKey(name)por campo). -
validateSó analisa oMap(não instancia a classe). RetornaList<EasyIssue>com:missing_required,type_mismatch,invalid_enum, etc. -
fromJsonSafeConversão tolerante. Nunca lança; aplica fallbacks e reporta problemas viaonIssue(EasyIssue). Por padrão rodavalidateantes (runValidate:true).
EasyIssue (retorno de problemas) #
class EasyIssue {
final String path; // ex: "address.number", "tags[2]"
final String code; // ex: "type_mismatch", "missing_required"
final String message;
}
Exemplo de uso:
final issues = <EasyIssue>[];
final user = userFromJsonSafe(json, onIssue: issues.add);
for (final i in issues) print('${i.path} - ${i.code}');
Regras rápidas #
-
Case Style
@EasyJson(caseStyle: CaseStyle.snake)→userName↔user_name.@EasyKey(name: 'e_mail')sobrescreve o nome do campo. -
Enum
fromJson:Enum.values.byName(...)(string inválida → erro).fromJsonSafe: aceita string ou índice; se inválido usafallback(@EasyKey(enumFallbackName: 'guest')) e geraEasyIssue.
-
DateTime
fromJson: normalmente esperaString ISO(ou seu converter).fromJsonSafe: aceitaString ISO,int/num epoch(ms),DateTime; senão, fallbackDateTime(0)+EasyIssue.
-
Coleções (List/Set/Map)
fromJsonSafe: coage itens/valores inválidos para fallback, marca o índice/chave empath.Set: itens inválidos são descartados (mantém unicidade).
-
Fallbacks per-field
@EasyKey(fallback: '0'),@EasyKey(itemFallback: "''"), etc. (Se não definir, o gerador escolhe um valor padrão seguro.)
Conversores custom (rápido) #
class TmDateMs {
static DateTime fromJson(Object? v) => DateTime.fromMillisecondsSinceEpoch(v as int);
static Object toJson(DateTime v) => v.millisecondsSinceEpoch;
}
@EasyJson()
class Order {
@EasyKey(convertFromJson: TmDateMs.fromJson, convertToJson: TmDateMs.toJson)
final DateTime createdAt;
}
Validação isolada (sem instanciar) #
final problems = orderValidate(json);
if (problems.isNotEmpty) print(problems.first.message);
Exemplo completo (rápido) #
final issues = <EasyIssue>[];
final order = orderFromJsonSafe(json, onIssue: issues.add);
print(order.toJson());
print(issues.map((e) => '${e.path}: ${e.code}').toList());