Un texto JSON debe contener al menos dos octetos


Recibí este error, y no pude encontrar ninguna respuesta razonable a esta pregunta, así que pensé en escribir un resumen del problema.

Si ejecuta este fragmento en irb:

JSON.parse( nil )

Verás el siguiente error:

TypeError: can't convert nil into String

Esperaba que la función regresara nil, y no un TypeError. Si convierte toda la entrada usando to_s, entonces verá el error de octeto:

JSON::ParserError: A JSON text must at least contain two octets!

Eso está muy bien. Si usted no sabe lo que es un octeto, lea este post para un resumen y solución: ¿Qué es un octeto JSON y por qué se requieren dos?

Solución

La variable que está pasando es una cadena vacía. No intente usar una cadena vacía en el método JSON.parse.

Pregunta

Entonces, ahora que sé la causa del error, ¿qué patrón debo usar para manejar esto? Estoy un poco detestado a monkey parchear la biblioteca JSON para permitir nil valores. Cualquier sugerencia sería muy apreciada.

Author: Community, 2011-12-05

4 answers

parsed = json && json.length >= 2 ? JSON.parse(json) : nil

Pero realmente la biblioteca debería ser capaz de manejar este caso y devolver nil. Los navegadores web con soporte JSON incorporado parecen funcionar como se espera después de todo.


O para hacerlo con un mini parche solo ligeramente intrusivo:

module JSON
  def self.parse_nil(json)
    JSON.parse(json) if json && json.length >= 2
  end
end

parsed = JSON.parse_nil(json)
 41
Author: Alex Wayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-05 19:18:14

Según json.org

JSON se basa en dos estructuras:

  1. Una colección de pares nombre/valor. En varios idiomas, esto se realiza como un objeto, registro, estructura, diccionario, tabla hash, lista con claves o matriz asociativa.

  2. Una lista ordenada de valores. En la mayoría de los idiomas, esto se realiza como una matriz, vector, lista o secuencia.

Entonces, un mínimo de dos octetos(8 bits) requeridos en el nivel superior sería {} o []

IMO, la mejor solución sería asegurarse de que el argumento a JSON.parse es un objeto strigified o una matriz strigified. :-)

 3
Author: Sagar Ranglani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-29 08:52:25
data.presence && JSON.parse(data)

JSON.parse(data.presence || '{}')
 2
Author: Денис Препелица,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-20 09:52:04
hash = JSON.parse(json) rescue {}
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''
 0
Author: Ich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-28 11:40:00