Suporte a JSON nativo do navegador (window.JSON)


92

Tenho visto referências a alguns navegadores que suportam nativamente a análise / serialização JSON de objetos com segurança e eficiência por meio do window.JSONobjeto, mas os detalhes são difíceis de encontrar. Alguém pode apontar na direção certa? Quais são os métodos que este objeto expõe? Em quais navegadores ele é compatível?


8
Consulte Quando posso usar a análise JSON? para obter informações sobre navegadores com suporte nativo para o objeto JSON .
outis

Respostas:


108

Todos os navegadores modernos suportam codificação / decodificação JSON nativa (Internet Explorer 8+, Firefox 3.1+, Safari 4+ e Chrome 3+). Basicamente, JSON.parse(str)irá analisar a string JSON stre retornar um objeto, e JSON.stringify(obj)irá retornar a representação JSON do objeto obj.

Mais detalhes no artigo MDN .


Sei que o suporte não é muito difundido, mas usar esse método deve ser muito mais rápido e seguro do que eval () fazer uma string, então quero usá-lo onde estiver disponível. Alguma ideia de suporte de outros navegadores?
levik

17
Ah, e em uma nota lateral, NUNCA eval () strings JSON. Em vez disso, use uma das muitas bibliotecas de análise JSON disponíveis.
Sasha Chedygov

1
@colbeerhey: Sim, é o que vejo com mais frequência. Você também pode roubar jQuery's.
Sasha Chedygov

2
Para referência, quando você diz "NUNCA eval () ..." e depois menciona que json2 é a biblioteca com suporte popular, é importante notar que ela usa eval, mas tenta validar a string usando regex primeiro. Isso é mais rápido do que validar e analisar a string, embora existam analisadores que não validam com desempenho comparável. json2.js ainda é provavelmente a melhor escolha, mesmo que apenas por sua abrangência.
TheXenocide

2
@TheXenocide: Bom ponto, mas seu autor provavelmente gastou uma boa parte do tempo naquele código de validação, então eu digo nunca eval()strings JSON porque você estará reinventando a roda e provavelmente errará.
Sasha Chedygov

30

jQuery-1.7.1.js - 555 linha ...

parseJSON: function( data ) {
    if ( typeof data !== "string" || !data ) {
        return null;
    }

    // Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim( data );

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    // Make sure the incoming data is actual JSON
    // Logic borrowed from http://json.org/json2.js
    if ( rvalidchars.test( data.replace( rvalidescape, "@" )
        .replace( rvalidtokens, "]" )
        .replace( rvalidbraces, "")) ) {

        return ( new Function( "return " + data ) )();

    }
    jQuery.error( "Invalid JSON: " + data );
}





rvalidchars = /^[\],:{}\s]*$/,

rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,

rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,

rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,

4
Agradável. Bom argumento para usar jQuery.
OneWorld

11
Mais como um argumento para olhar dentro de jQuery =)
Olga

13

A vantagem de usar json2.js é que ele só instalará um analisador se o navegador ainda não tiver um. Você pode manter a compatibilidade com navegadores mais antigos, mas use o analisador JSON nativo (que é mais seguro e rápido) se estiver disponível.

Navegadores com JSON nativo:

  • IE8 +
  • Firefox 3.1+
  • Safari 4.0.3+
  • Opera 10.5+

G.


10

[estendendo o fanatismo pela música comentário ]

Se você estiver usando jQuery, use parseJSON

var obj = jQuery.parseJSON(data)

Internamente, ele verifica se o navegador oferece suporte a .JSON.parse e (se disponível) chama a janela nativa.JSON.parse.

Caso contrário, analisa a si mesmo.


8

Para o benefício de qualquer pessoa que encontrar este tópico - para uma lista definitiva e atualizada de navegadores que suportam o objeto JSON, veja aqui. . Uma breve resposta genérica - praticamente todos os navegadores que realmente importam no ano de 2013+.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.