JsonDecoder în Dart

Convertorul reutilizabil din JSON în obiecte Dart; se poate lega de utf8.decoder pentru fișiere și fluxuri.

Sintaxă
const JsonDecoder([Object? reviver(Object? key, Object? value)?])
dynamic convert(String input)

Ce face JsonDecoder

JsonDecoder este clasa din spatele lui jsonDecode: const JsonDecoder().convert(text) dă același rezultat. Clasa este utilă când ai nevoie de un Converter: de exemplu ca să transformi un flux de octeți (Stream<List<int>>) dintr-un fișier sau din rețea direct în obiecte, cu utf8.decoder.fuse(const JsonDecoder()).

Parametrul opțional reviver este apelat pentru fiecare valoare, de la cele mai adânci spre rădăcină. Ce returnează înlocuiește valoarea; așa poți transforma, de exemplu, textele cu date în DateTime.

Parametri

Parametru Descriere
reviver Opțional. Funcție (cheie, valoare) care poate înlocui valorile decodate.

Ce returnează

convert returnează valoarea decodată (dynamic).

Exemple

Exemplul 1: convert și reviver

Reviver-ul transformă câmpul data în DateTime chiar în timpul decodării.

import 'dart:convert';

void main() {
  final decodor = JsonDecoder((cheie, valoare) {
    if (cheie == 'data' && valoare is String) return DateTime.parse(valoare);
    return valoare;
  });
  final ev = decodor.convert('{"eveniment": "Zilele Iașului", "data": "2026-10-14"}') as Map;
  final DateTime data = ev['data'];
  print(ev['eveniment']);
  print('Luna: ${data.month}, ziua: ${data.day}');
}

Rezultat

Zilele Iașului
Luna: 10, ziua: 14

Exemplul 2: Din octeți direct în obiecte

fuse leagă decodorul UTF-8 de cel JSON; rezultatul primește octeți (ca dintr-un fișier) și dă obiecte.

import 'dart:convert';

void main() {
  final octeti = utf8.encode('{"oras": "Timișoara", "locuitori": 250000}');
  final decodor = utf8.decoder.fuse(const JsonDecoder());
  final date = decodor.convert(octeti) as Map<String, dynamic>;
  print('${date['oras']}: ${date['locuitori']} locuitori');
}

Rezultat

Timișoara: 250000 locuitori

Greșeli frecvente

  • Uiți să returnezi valoarea în reviver pentru cheile pe care nu le modifici. Dacă nu returnezi nimic, valoarea devine null.

Comenzi înrudite

  • jsonDecode: Citește un text JSON și îl transformă în Map, List, String, num, bool sau null; dă FormatException la text greșit.
  • JsonEncoder.withIndent: Un convertor reutilizabil spre JSON; varianta withIndent scrie JSON frumos, pe mai multe rânduri, cu indentare.
  • utf8.decoder: Convertoarele din spatele lui utf8: decoder transformă fluxuri de octeți în text, encoder face invers.