ti-enxame.com

Um texto JSON deve conter pelo menos dois octetos

Eu recebi esse erro e não consegui encontrar uma resposta razoável para essa pergunta, então pensei em escrever um resumo do problema.

Se você executar esse trecho no irb:

JSON.parse( nil )

Você verá o seguinte erro:

TypeError: can't convert nil into String

Eu esperava que a função retornasse nil, e não um TypeError. Se você converter todas as entradas usando to_s, verá o erro do octeto:

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

Tudo bem e bem. Se você não sabe o que é um octeto, leia esta postagem para obter um resumo e uma solução: O que é um octeto JSON e por que dois são necessários?

Solução

A variável que você está passando é uma sequência vazia. Não tente usar uma string vazia no método JSON.parse.

Pergunta

Então, agora eu sei a causa do erro, que padrão devo usar para lidar com isso? Eu sou um pouco repugnante por consertar um macaco na biblioteca JSON para permitir valores nil. Todas as sugestões serão muito apreciadas.

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

Mas realmente a biblioteca deve ser capaz de lidar com este caso e retornar nulo. Navegadores da Web com suporte JSON interno parecem funcionar exatamente como você espera, afinal.


Ou para fazer isso com um mini patch apenas um pouco intrusivo:

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

parsed = JSON.parse_nil(json)
43
Alex Wayne
data.presence && JSON.parse(data)

JSON.parse(data.presence || '{}')
4

De acordo com json.org

JSON é construído em duas estruturas:

  1. Uma coleção de pares nome/valor. Em vários idiomas, isso é realizado como um objeto, registro, estrutura, dicionário, tabela de hash, lista de chaves ou matriz associativa.

  2. Uma lista ordenada de valores. Na maioria dos idiomas, isso é realizado como uma matriz, vetor, lista ou sequência.

Portanto, no mínimo dois octetos (8 bits) necessários no nível superior seriam {} ou []

Na IMO, a melhor solução seria garantir que o argumento para JSON.parse seja um objeto estrigificado ou uma matriz estrigificada. :-)

3
Sagar Ranglani
hash = JSON.parse(json) rescue {}
array = JSON.parse(json) rescue []
string = JSON.parse(json) rescue ''
0
Ich