En este tema, aprenderemos cómo manejar y parsear datos JSON en Flutter utilizando el lenguaje de programación Dart. JSON (JavaScript Object Notation) es un formato de intercambio de datos ligero y fácil de leer y escribir para los humanos, y fácil de parsear y generar para las máquinas.
Contenido
- ¿Qué es JSON?
- Decodificación de JSON en Dart
- Codificación de JSON en Dart
- Ejemplo Práctico
- Ejercicios Prácticos
- ¿Qué es JSON?
JSON es un formato de texto que se utiliza para representar datos estructurados basados en la sintaxis de objetos de JavaScript. Es comúnmente utilizado para transmitir datos en aplicaciones web (por ejemplo, enviar datos desde el servidor al cliente).
Ejemplo de JSON
- Decodificación de JSON en Dart
Para decodificar (parsear) JSON en Dart, utilizamos la función jsonDecode
del paquete dart:convert
. Esta función convierte una cadena JSON en un mapa de Dart.
Ejemplo de Decodificación
import 'dart:convert'; void main() { String jsonString = '{"name": "John Doe", "age": 30, "isStudent": false, "courses": ["Math", "Science", "History"]}'; Map<String, dynamic> user = jsonDecode(jsonString); print('Name: ${user['name']}'); print('Age: ${user['age']}'); print('Is Student: ${user['isStudent']}'); print('Courses: ${user['courses']}'); }
Explicación
jsonDecode
convierte la cadena JSON en un mapa de Dart.- Accedemos a los valores del mapa utilizando las claves correspondientes.
- Codificación de JSON en Dart
Para codificar (serializar) un objeto de Dart a una cadena JSON, utilizamos la función jsonEncode
del paquete dart:convert
.
Ejemplo de Codificación
import 'dart:convert'; void main() { Map<String, dynamic> user = { 'name': 'John Doe', 'age': 30, 'isStudent': false, 'courses': ['Math', 'Science', 'History'] }; String jsonString = jsonEncode(user); print(jsonString); }
Explicación
jsonEncode
convierte el mapa de Dart en una cadena JSON.- La cadena JSON resultante puede ser utilizada para transmitir datos a través de una red o almacenarlos.
- Ejemplo Práctico
Vamos a crear una clase User
en Dart y veremos cómo podemos decodificar y codificar objetos de esta clase desde y hacia JSON.
Definición de la Clase User
class User { String name; int age; bool isStudent; List<String> courses; User({required this.name, required this.age, required this.isStudent, required this.courses}); // Método para crear un objeto User desde un mapa JSON factory User.fromJson(Map<String, dynamic> json) { return User( name: json['name'], age: json['age'], isStudent: json['isStudent'], courses: List<String>.from(json['courses']), ); } // Método para convertir un objeto User a un mapa JSON Map<String, dynamic> toJson() { return { 'name': name, 'age': age, 'isStudent': isStudent, 'courses': courses, }; } }
Uso de la Clase User
import 'dart:convert'; void main() { String jsonString = '{"name": "John Doe", "age": 30, "isStudent": false, "courses": ["Math", "Science", "History"]}'; // Decodificar JSON a objeto User Map<String, dynamic> userMap = jsonDecode(jsonString); User user = User.fromJson(userMap); print('Name: ${user.name}'); print('Age: ${user.age}'); print('Is Student: ${user.isStudent}'); print('Courses: ${user.courses}'); // Codificar objeto User a JSON String encodedJson = jsonEncode(user.toJson()); print('Encoded JSON: $encodedJson'); }
Explicación
User.fromJson
es un constructor de fábrica que crea una instancia deUser
a partir de un mapa JSON.toJson
es un método que convierte una instancia deUser
en un mapa JSON.- Utilizamos
jsonDecode
para convertir la cadena JSON en un mapa y luegoUser.fromJson
para crear una instancia deUser
. - Utilizamos
jsonEncode
para convertir el objetoUser
en una cadena JSON.
- Ejercicios Prácticos
Ejercicio 1
Dado el siguiente JSON, crea una clase Product
en Dart y escribe los métodos fromJson
y toJson
para decodificar y codificar objetos Product
.
Solución
class Product { int id; String name; double price; bool inStock; Product({required this.id, required this.name, required this.price, required this.inStock}); factory Product.fromJson(Map<String, dynamic> json) { return Product( id: json['id'], name: json['name'], price: json['price'], inStock: json['inStock'], ); } Map<String, dynamic> toJson() { return { 'id': id, 'name': name, 'price': price, 'inStock': inStock, }; } }
Ejercicio 2
Escribe un programa que decodifique el siguiente JSON a una lista de objetos Product
y luego codifique esa lista de vuelta a JSON.
[ {"id": 1, "name": "Laptop", "price": 999.99, "inStock": true}, {"id": 2, "name": "Mouse", "price": 19.99, "inStock": true}, {"id": 3, "name": "Keyboard", "price": 49.99, "inStock": false} ]
Solución
import 'dart:convert'; void main() { String jsonString = ''' [ {"id": 1, "name": "Laptop", "price": 999.99, "inStock": true}, {"id": 2, "name": "Mouse", "price": 19.99, "inStock": true}, {"id": 3, "name": "Keyboard", "price": 49.99, "inStock": false} ] '''; // Decodificar JSON a lista de objetos Product List<dynamic> productListJson = jsonDecode(jsonString); List<Product> productList = productListJson.map((json) => Product.fromJson(json)).toList(); productList.forEach((product) { print('Product Name: ${product.name}, Price: ${product.price}'); }); // Codificar lista de objetos Product a JSON String encodedJson = jsonEncode(productList.map((product) => product.toJson()).toList()); print('Encoded JSON: $encodedJson'); }
Explicación
- Decodificamos la cadena JSON a una lista de mapas.
- Convertimos cada mapa en un objeto
Product
utilizandoProduct.fromJson
. - Codificamos la lista de objetos
Product
de vuelta a JSON utilizandojsonEncode
.
Conclusión
En esta lección, hemos aprendido cómo decodificar y codificar datos JSON en Dart. Hemos visto ejemplos prácticos y hemos trabajado con una clase personalizada para manejar datos JSON de manera eficiente. Estos conocimientos son fundamentales para trabajar con APIs y manejar datos en aplicaciones Flutter.
Curso de Desarrollo con Flutter
Módulo 1: Introducción a Flutter
- ¿Qué es Flutter?
- Configuración del Entorno de Desarrollo
- Entendiendo la Arquitectura de Flutter
- Creando Tu Primera App con Flutter
Módulo 2: Conceptos Básicos de Programación en Dart
- Introducción a Dart
- Variables y Tipos de Datos
- Sentencias de Control de Flujo
- Funciones y Métodos
- Programación Orientada a Objetos en Dart
Módulo 3: Widgets en Flutter
- Introducción a los Widgets
- Widgets Stateless vs Stateful
- Widgets Básicos
- Widgets de Diseño
- Widgets de Entrada y Formularios
Módulo 4: Gestión de Estado
Módulo 5: Navegación y Enrutamiento
- Introducción a la Navegación
- Navegación Básica
- Rutas Nombradas
- Pasando Datos Entre Pantallas
- Deep Linking
Módulo 6: Redes y APIs
- Obteniendo Datos de Internet
- Parseo de Datos JSON
- Manejo de Errores de Red
- Usando APIs REST
- Integración con GraphQL
Módulo 7: Persistencia y Almacenamiento
- Introducción a la Persistencia
- Preferencias Compartidas
- Almacenamiento de Archivos
- Base de Datos SQLite
- Usando Hive para Almacenamiento Local
Módulo 8: Conceptos Avanzados de Flutter
- Animaciones en Flutter
- Custom Paint y Canvas
- Canales de Plataforma
- Isolates y Concurrencia
- Optimización de Rendimiento
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias
- Pruebas de Widgets
- Pruebas de Integración
- Técnicas de Depuración
Módulo 10: Despliegue y Mantenimiento
- Preparación para el Lanzamiento
- Construcción para iOS
- Construcción para Android
- Integración Continua/Despliegue Continuo (CI/CD)
- Mantenimiento y Actualización de Tu App