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.
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)
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:
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.
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. :-)
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 || '{}')
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 ''
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