Inhaltsverzeichnis
Analysieren von JSON mit dart:convert
View more Tutorials:


In vielen Anwendungen Dart/Flutter müssen Sie häufig mit JSON-formatierten Daten arbeiten. In diesem Artikel erfahren Sie, wie Sie die dart:convert-Bibliothek verwenden, um JSON-Daten manuell zu parsen. Dies ist eine eingebaute Bibliothek in Dart und eignet sich für kleine Projekte.
Bei Anwendungen mit komplexeren JSON-Modellen kann die Verwendung von dart:convert schnell mühsam und repetitiv werden und zu vielen kleinen Fehlern führen. In diesem Fall sollten Sie die Bibliothek dart_json_mapper oder json_serializable verwenden.
- TODO Link?
Obwohl es mittlerweile viele Dart JSON-Bibliotheken gibt, die von der Community bereitgestellt werden, ist es nicht so vielfältig wie Java. Sie können die Frage stellen: „Gibt es eine Bibliothek, die GSON/Jackson/Moshi vom Java entspricht?“. Die Antwort ist ja, es ist dart_json_mapper.
Als einfache Bibliothek benötigt dart:convert keine zusätzliche Konfiguration und ist die erste JSON-Verarbeitungsbibliothek, an die Sie für kleine Projekte denken müssen.
Einige Funktionen werden von der Bibliothek dart:convert bereitgestellt:
dynamic jsonDecode(String source, {Object? reviver(Object? key, Object? value)?})
String jsonEncode(Object? object, {Object? toEncodable(Object? nonEncodable)?})
dynamic jsonDecode(String source, {Object? reviver(Object? key, Object? value)?})
Die Funktion jsonDecode() wird verwendet, um einen JSON-Text zu parsen und ein Dart-Objekt zurückzugeben. Diese Funktion gibt den Typ dynamic zurück. Dieser Rückgabetyp kann sein:
- Map<String,dynamic>
- List<dynamic>
-
Ein Dart-Objekt, wenn der Parameter reviver nicht null ist (siehe Beispiel unten).
Parameter:
-
source: Ein Text im JSON-Format.
-
reviver: Eine optionale Funktion, die für jede Eigenschaft aufgerufen wird, die beim Analysieren dieses JSON-Texts gefunden wird. Der Parameter [key=null] entspricht dem globalen JSON-Objekt. Eigenschaften auf Blattebene werden zuerst ausgeführt, Eigenschaften auf Stammebene werden zuletzt ausgeführt.
Beispiel: Die Funktion jsonDecode() gibt eine Map<String,dynamic> zurück:
json_jsonDecode_ex1.dart
import 'dart:convert';
void main() {
var jsonString = '''{
"name": "John Smith",
"email": "[email protected]",
"salary": 5000,
"addresses": ["Address 1", "Address 2"]
}''';
Map<String, dynamic> map = jsonDecode(jsonString);
for (var key in map.keys) {
print('$key --> ${map[key]}');
}
print(' --- ');
List<dynamic> addresses = map['addresses'];
for(String address in addresses) {
print('Address: $address');
}
}
Output:
name --> John Smith
email --> [email protected]
salary --> 5000
addresses --> [Address 1, Address 2]
---
Address: Address 1
Address: Address 2
Nächstes Beispiel mit komplexerem JSON:
json_jsonDecode_ex2.dart
import 'dart:convert';
void main() {
var jsonString = '''{
"name": "John Smith",
"email": "[email protected]",
"children": [ {
"name": "Jack Smith",
"email": "[email protected]"
}, {
"name": "Harry Smith",
"email": "[email protected]"
}]
}''';
Map<String, dynamic> map = jsonDecode(jsonString);
for (var key in map.keys) {
print('$key --> ${map[key]}');
}
print(' --- ');
List<dynamic> children = map['children'];
for (dynamic child in children) {
var childMap = child as Map<String, dynamic>;
for (var k in childMap.keys) {
print(' $k --> ${childMap[k]}');
}
}
}
Output:
name --> John Smith
email --> [email protected]
children --> [{name: Jack Smith, email: [email protected]}, {name: Harry Smith, email: [email protected]}]
---
name --> Jack Smith
email --> [email protected]
name --> Harry Smith
email --> [email protected]
Beispiel: Die Funktion jsonDecode() gibt eine List<dynamic> zurück:
json_jsonDecode_ex2.dart
import 'dart:convert';
void main() {
var jsonString = '''[ {
"name": "Jack Smith",
"email": "[email protected]"
}, {
"name": "Harry Smith",
"email": "[email protected]"
}]''';
List<dynamic> list = jsonDecode(jsonString);
for (var element in list) {
var map = element as Map<String, dynamic>;
for (var k in map.keys) {
print('$k --> ${map[k]}');
}
}
}
Output:
name --> Jack Smith
email --> [email protected]
name --> Harry Smith
email --> [email protected]
Beispiel: Verwenden Sie die Funktion jsonDecode() mit dem Parameter reviver, um einen Text JSON in ein Objekt Dart umzuwandeln.
json_jsonDecode_reviver_ex1.dart
import 'dart:convert';
void main() {
var jsonString = '''{
"name": "John Smith",
"email": "[email protected]",
"contact": {
"address": "Address 1",
"phone": "12345"
}
}''';
Employee emp = jsonDecode(jsonString, reviver: (k, v) {
if (v is Map) {
if (k == 'contact') {
var contactRaw = v as Map<String, dynamic>;
return Contact.fromRaw(contactRaw);
} else {
// k == null
var empRaw = v as Map<String, dynamic>;
return Employee.fromRaw(empRaw);
}
}
return v;
});
print('Emp Name: ${emp.name}');
print('Emp Email: ${emp.email}');
print('Address: ${emp.contact.address}');
}
class Contact {
String address;
String phone;
Contact(this.address, this.phone); // Constructor
Contact.fromRaw(Map<String, dynamic> map) // Constructor
: address = map['address'],
phone = map['phone'];
}
class Employee {
String name;
String email;
Contact contact;
Employee(this.name, this.email, this.contact); // Constructor
Employee.fromRaw(Map<String, dynamic> map) // Constructor
: name = map['name'],
email = map['email'],
contact = map['contact'];
}
Output:
Emp Name: John Smith
Emp Email: [email protected]
Address: Address 1
String jsonEncode(Object? object, {Object? toEncodable(Object? nonEncodable)?})
Die Funktion jsonEncode() wird verwendet, um ein Objekt Dart in einen JSON-Text umzuwandeln.
Die Parameters:
- object: Ein Objekt Dart.
- toEncodable: Eine optionale Funktion, die verwendet wird, um nicht kodierbare Dart-Objekte in kodierbare Objekte umzuwandeln. Wenn dieser Parameter nicht angegeben wird, wird alternativ die Funktion toJson() verwendet.
Beispiel: Ein Dart-Objekt mit allen codierbaren Eigenschaften:
// An Encodable object:
var employee = {
'name': 'John Smith',
'email': '[email protected]',
'contact': {
'address': 'Address 1',
'phone': '12345'}
};
Beispiel: Ein Dart-Objekt mit mehreren kodierbaren Eigenschaften und einer nicht kodierbaren Eigenschaft:
var employee = {
'name': 'John Smith', // Encodable
'email': '[email protected]', // Encodable
'contact': Contact('Address 1', '12345') // Unencodable!!!
};
Beispiel: Verwenden der Funktion jsonEncode() zum Konvertieren eines Dar-Objekts in JSON-Text:
json_jsonEncode_ex1.dart
import 'dart:convert';
void main() {
// An Object (Looks like a JSON):
var employee = {
'name': 'John Smith',
'email': '[email protected]',
'contact': {
'address': 'Address 1',
'phone': '12345'}
};
var jsonString = jsonEncode(employee);
print(jsonString);
}
Output:
{"name":"John Smith","email":"[email protected]","contact":{"address":"Address 1","phone":"12345"}}
Beispiel: Konvertieren eines Map-Objekts in JSON-Text:
json_jsonEncode_ex2.dart
import 'dart:convert';
void main() {
var map = Map<String,dynamic>();
map['name'] = 'John Smith';
map['email'] = '[email protected]';
var jsonString = jsonEncode(map);
print(jsonString);
}
Output:
{"name":"John Smith","email":"[email protected]"}
Beispiel: Verwendung der Funktion jsonEncode() mit dem Parameter toEncodable:
json_jsonEncode_toEncodable_ex1.dart
import 'dart:convert';
void main() {
var contact = Contact('Address 1', '12345');
var employee = {
'name': 'John Smith', // Encodable
'email': '[email protected]', // Encodable
'contact': contact // Un-encodable!!!
};
var jsonString = jsonEncode(employee, toEncodable: (nonEncodable) {
if (nonEncodable is Contact) {
return {
'address': nonEncodable.address,
'phone': nonEncodable.phone
};
}
return null;
});
print(jsonString);
}
class Contact {
String address;
String phone;
Contact(this.address, this.phone); // Constructor
}
Output:
{"name":"John Smith","email":"[email protected]","contact":{"address":"Address 1","phone":"12345"}}
Beispiel: Verwendund der Funktion jsonEncode() mit dem Parameter toEncodable:
json_jsonEncode_toEncodable_ex2.dart
import 'dart:convert';
void main() {
var contact = Contact('Address 1', '12345');
var employee = Employee('John Smith', '[email protected]', contact);
var jsonString = jsonEncode(employee, toEncodable: (nonEncodable) {
if (nonEncodable is Contact) {
return {
'address': nonEncodable.address,
'phone': nonEncodable.phone
};
} else if(nonEncodable is Employee) {
return {
'name': nonEncodable.name,
'email': nonEncodable.email,
'contact': nonEncodable.contact
};
}
});
print(jsonString);
}
class Contact {
String address;
String phone;
Contact(this.address, this.phone); // Constructor
}
class Employee {
String name;
String email;
Contact contact;
Employee(this.name, this.email, this.contact); // Constructor
}