Tecnología · GUÍA PRÁCTICA
¿JSONDecodeError en línea 1, columna 1? Inspecciona los bytes antes de cambiar el parser
El carácter cero indica dónde falló, no por qué. Conserva estado, tipo de medio, longitud y una huella segura; clasifica cuerpo vacío, HTML, decodificación o truncado; repara el contrato del productor o cliente y verifica casos válido, vacío e inválido.

El carácter cero indica dónde falló, no por qué. Conserva estado, tipo de medio, longitud y una huella segura; clasifica cuerpo vacío, HTML, decodificación o truncado; repara el contrato del productor o cliente y verifica casos válido, vacío e inválido.
Un texto JSON contiene un valor serializado; un cuerpo vacío o solo con espacios no es JSON. Python lanza JSONDecodeError cuando el documento recibido no es JSON válido.
1. Congela el sobre de respuesta antes de analizar
Registra método, URL censurada, estado, redirecciones, Content-Type, Content-Encoding, longitud declarada, bytes recibidos, runtime y excepción exacta. Si la política lo permite, conserva solo hash y un prefijo corto censurado; nunca tokens, cookies ni datos personales completos.
Lee el cuerpo una sola vez y distingue ausente, cero bytes, espacios, HTML, texto parecido a JSON o bytes indecodificables. No llames json(), text() y json() sobre el mismo stream consumido y atribuyas el segundo fallo al productor.
2. Clasifica qué empieza en el carácter cero
Vacío o espacios en posición cero apuntan a contrato sin cuerpo, cierre prematuro o payload descartado. Un signo menor inicial suele indicar HTML de login, proxy o error. Otros prefijos revelan endpoint equivocado, BOM, encoding o compresión.
Separa errores de sintaxis tras comenzar JSON de fallos en carácter cero. Registra línea, columna y posición como lugares, no causas. Valida todo el documento: datos extra, truncado y valores concatenados exigen reparaciones distintas.
3. Sigue al productor y la ruta de transformación
Sigue la respuesta desde handler por middleware, proxy, caché, descompresor y cliente. Correlaciona request ID y horas sin copiar secretos. Confirma qué capa fijó estado, tipo, encoding y cuerpo, y si una redirección cambió el endpoint.
En archivos demuestra ruta, longitud, encoding y límite de escritura atómica. Un archivo nuevo vacío, temporal viejo o escritura parcial concurrente no se arregla relajando el parser. Conserva los bytes antes de que otro escritor los reemplace.
4. Repara el contrato, no el síntoma
Si un éxito no tiene representación por contrato, modela esa rama y no la analices. Si promete JSON, el productor debe devolver un valor válido y Content-Type correcto; corrige autenticación, proxy o ruta si llegó HTML; corrige encoding o descompresión en su capa.
Captura solo la excepción exacta para añadir contexto seguro o convertirla en error de contrato tipado. No devuelvas objeto vacío, reintentes toda sintaxis ni elimines caracteres: puedes ocultar pérdida, efectos duplicados o caída aguas arriba.
5. Verifica tres casos y un fallo observable
Prueba respuesta JSON válida, éxito intencional sin cuerpo y respuesta inválida o de tipo erróneo. La válida debe producir el tipo esperado, la vacía ir a la rama documentada y la inválida fallar con diagnóstico tipado y evidencia segura.
Con carga representativa verifica tasa de parseo, distribución de longitudes, diferencias de estado y tipo, redirecciones y reintentos. Hay éxito cuando productor y consumidor concuerdan, los fallos siguen visibles, no se registran cuerpos sensibles y existe reversión.
