2011-12-05 20 views
56

Recibí este error y no pude encontrar ninguna respuesta razonable a esta pregunta, así que pensé en escribir un resumen del problema.Un texto JSON debe contener al menos dos octetos

Si ejecuta este fragmento en el IRB:

JSON.parse(nil) 

Vas a ver el siguiente error:

TypeError: can't convert nil into String 

yo era una especie de esperar que la función devuelva nil, y no un TypeError. Si convierte todas las entradas utilizando to_s, entonces usted verá el error del octeto:

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

Eso está muy bien y bien. Si usted no sabe lo que es un octeto, leer este post para un resumen y una solución: What is a JSON octet and why are two required?

Solución

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

Pregunta

Por lo tanto, ahora sé la causa del error, qué patrón se debe utilizar para manejar esto? Estoy un poco reacio a parchear mono la biblioteca JSON para permitir nil valores. Cualquier sugerencia sería muy apreciada.

+2

Posiblemente debido al hecho de que una cadena javascript válida MÍNIMA absoluta es '" "', que es dos octetos (y el objeto mínimo absoluto es '{}'). Podría ser quien escribió que el codificador/analizador no consideró que 'null' también es un valor válido de JavaScript. –

Respuesta

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

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


O hacerlo con un mini parche sólo un poco intrusivo:

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

parsed = JSON.parse_nil(json) 
+0

Sí, aunque tendré que repetir esto en todas partes que intento analizar. Tal vez debería enviar un parche. – Cory

+0

Agregó un pequeño parche al módulo JSON que puede usar en su lugar. No implica ningún método alocado aliasing magic ni nada, y es fácilmente reutilizable. –

+0

@Alex ¿Dónde implementaría el mini parche para detectar esto en toda la aplicación? – RSG

0
hash = JSON.parse(json) rescue {} 
array = JSON.parse(json) rescue [] 
string = JSON.parse(json) rescue '' 
+9

Esto es bastante malo como rescatará cualquier cosa, incluidos todos los otros tipos de errores del analizador que probablemente desee conocer. –

+0

Eso es verdad. Debe saberlo y decidir en qué casos es útil ... – Ich

3

Según json.org

JSON se basa en dos estructuras:

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

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

Por lo tanto, un mínimo de dos octetos (8 bits) que se requieren en el nivel superior sería {} o []

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

+0

Esto ya no es cierto. Un [RFC 7159] (https://tools.ietf.org/html/rfc7159) de marzo de 2014 actualiza esas restricciones. Todos los siguientes son válidos JSON: 'null',' false', 'true',' 42', '" Some string "', '{}', '[]' – Dan

1
data.presence && JSON.parse(data) 

JSON.parse(data.presence || '{}') 
Cuestiones relacionadas