Saltar al contenido principal

Cadena de consulta a JSON

Este conversor decodifica una cadena de consulta de URL en un objeto JSON estructurado en tu navegador. Los valores se descodifican con porcentajes, tratando el + como un espacio, las claves repetidas se convierten en arrays, las rutas a[b]=c se anidan en objetos y los valores vacíos se decodifican como null. El escape porcentual malformado se rechaza con la posición nombrada. No se sube nada.

Solo local

Cadena de consulta a JSON: explicación

Una cadena de consulta parece un ruido — ampersands, signos de igual, escapes porcentuales — pero es un registro y los registros merecen estructura. Este decodificador convierte uno en un objeto JSON: las claves de la izquierda de cada =, los valores decodificados a la derecha, las claves repetidas se recopilan en arrays y las rutas a[b]=c se pliegan en objetos anidados. Es la inversa exacta del conversor de JSON a Cadena de consulta de este sitio, por lo que el par es de ida y vuelta.

Dos convenciones importan y ambas se respetan. El signo + significa un espacio — la convención application/x-www-form-urlencoded que prácticamente todos los formularios, navegadores y servidores siguen hablando — mientras que %2B se decodifica como un + real. Y los valores permanecen como strings: una cadena de consulta no lleva información de tipo, por lo que page=2 llega como "2", honestamente, y no como una suposición que un código postal castigaría más tarde.

La decodificación ocurre enteramente en esta pestaña del navegador. La cadena se divide y se escapa por código en la página; no sale ninguna solicitud de la página y la Content-Security-Policy prohíbe las conexiones salientes por completo. Verifícalo en el panel de Red si quieres — permanece en silencio, y ese silencio es la afirmación de privacidad que se sostiene.

Construir la cadena que estás a punto de analizar es tarea de su herramienta hermana, el conversor de JSON a cadena de consulta, que emite la misma convención a[b]=c que lee este decodificador.

Una vez que el resultado JSON parece sospechoso — un corchete suelto, una comilla faltante — pégalo en el Validador de JSON y el carácter exacto en fallo se señala.

Cómo funciona realmente la decodificación

El conversor acepta la cadena de consulta con o sin su ? inicial. La divide por &, luego divide cada par en su primer =, por lo que una clave solo puede contener un signo de igual cuando está codificada en porcentaje — que es exactamente lo que el codificador del otro lado de este par hace. Luego, por cada par:

  • Decodificar: clave y valor se decodifican con porcentajes como UTF-8, con + leído como un espacio en los valores.
  • Anidar: los segmentos de corchete en una clave se convierten en objetos anidados — user[name] llega a {"user": {"name": ...}}, y a[user][city] anida dos niveles.
  • Recopilar: una clave vista más de una vez se convierte en un array de sus valores en el orden de llegada; una clave vista exactamente una vez permanece como escalar.
  • Vacío: un par con un valor vacío o faltante (token=, o un token simple sin =) se decodifica como null.

Las convenciones, entrada por entrada

La siguiente tabla es el contrato del decodificador en miniatura — cada fila es una regla documentada y no un accidente de implementación:

Par de entradaJSON decodificado
page=2{"page": "2"} — un string, sin inferencia de tipo
tag=navy&tag=math{"tag": ["navy", "math"]}
user[name]=Ada{"user": {"name": "Ada"}}
q=a%20b{"q": "a b"} — %20 decodificado
q=a+b{"q": "a b"} — + es un espacio
q=a%2Bb{"q": "a+b"} — el + sobrevive escapado
token={"token": null}

Cómo es el resultado

El ejemplo a continuación es el par exacto que produce el botón Cargar ejemplo: la misma cadena que emite la página JSON a Cadena de consulta, leída de vuelta. Ten en cuenta que page permanece como "2" y admin como "true" — strings, porque la URL no dijo nada sobre tipos. Los consumidores que quieran números convierten deliberadamente en el borde del programa, con el esquema en mano, en lugar de confiar en una inferencia que un código postal con cero a la izquierda rompería.

Rechazos, no suposiciones

Los escapes malformados son donde las herramientas de decodificación corrompen datos silenciosamente, por lo que este conversor rechaza en lugar de improvisar. Un signo de porcentaje debe comenzar un escape válido — dos dígitos hexadecimales que formen UTF-8 válido — y cualquier otra cosa obtiene un error nombrado:

  • %ZZ o %2 — no es hexadecimal, por lo que el error nombra la clave y la posición del carácter en lugar de emitir un porcentual literal o un byte omitido.
  • %FF solo — hexadecimalmente válido pero no UTF-8 válido, por lo que se rechaza en lugar de entregarse como mojibake aguas abajo.
  • Un % suelto al final de la cadena — un escape truncado, rechazado con su posición para que la fuente pueda arreglarse en lugar de suponerlo.

Preguntas frecuentes

¿Decodificar una cadena de consulta la sube a algún sitio?

No. La cadena se divide y decodifica por JavaScript en la página dentro de esta pestaña del navegador. La página no define ningún punto final de API para enviar datos, y su Content-Security-Policy bloquea las solicitudes salientes, por lo que no hay nada a lo que subir si el código lo intentara. Abre DevTools, convierte una cadena y el panel de Red permanece vacío — la afirmación se verifica a una sola vista.

¿Por qué todos los valores son strings?

Porque una cadena de consulta no lleva información de tipo: page=2 son los dos caracteres 2 según la URL. El decodificador se niega a adivinar, por lo que 2 permanece como "2" y true como "true" — la misma política que sigue el codificador. Convierte donde el esquema se conoce en su lugar; un código postal 02134 que se convierte silenciosamente en el número 2134 es la razón clásica por la que la inferencia duele.

¿Qué significa + al decodificar?

Un espacio. Esa es la convención application/x-www-form-urlencoded que navegadores y servidores han hablado durante décadas, y las cadenas de consulta en la naturaleza provienen casi exclusivamente de formularios. Un + literal debe llegar codificado como %2B — el codificador de este sitio lo emite así, y ambas formas se decodifican idénticamente aquí. La dirección inversa es consistente: los espacios salen como %20, los + como %2B.

¿Cómo se manejan las claves repetidas?

Una clave que aparece más de una vez se convierte en un array de sus valores en el orden en que llegaron: tag=navy&tag=math da {"tag": ["navy", "math"]}. Una clave vista exactamente una vez permanece como escalar. Esto coincide con cómo se comportan el analizador de Rack y el de Node's qs, y es la inversa precisa del codificador de este sitio, que repite la clave una vez por elemento del array.

¿Cómo se decodifica la notación a[b]=c?

Los segmentos de corchete se convierten en objetos anidados: user[name]=Ada se decodifica como {"user": {"name": "Ada"}}, y a[user][city] anida dos niveles de profundidad. Los segmentos numéricos permanecen como claves string — a[0] se convierte en la clave "0" — porque inventar arrays a partir de índices es una suposición que este decodificador rechaza hacer. Tanto los corchetes literales como sus formas escapadas %5B/%5D se aceptan, ya que los codificadores difieren en ese punto.

¿Qué pasa con un par sin valor?

Un valor vacío — token=, o un token simple sin = en absoluto — se decodifica como null en lugar de un string vacío. Esa es la inversa deliberada del conversor JSON a Cadena de consulta de este sitio, que emite null como un valor vacío, por lo que null sobrevive intacto el viaje de ida y vuelta. Si necesitas distinguir un string vacío de un valor ausente, una cadena de consulta fundamentalmente no puede expresar la diferencia.