Pergunta

Dada uma sequência de dados JSON, como você pode transformar essa sequência com segurança em um objeto JavaScript?

Obviamente você pode fazer isso de forma insegura com algo como ...

var obj = eval("(" + json + ')');

... mas isso nos deixa vulneráveis ​​à string json que contém outro código, que parece muito perigoso simplesmente avaliar.

Foi útil?

Solução

JSON.parse(jsonString) é uma abordagem JavaScript pura, desde que você possa garantir um navegador razoavelmente moderno.

Outras dicas

O método jQuery agora está obsoleto.Use este método:

let jsonObject = JSON.parse(jsonString);

Resposta original usando funcionalidade jQuery obsoleta:

Se você estiver usando jQuery, basta usar:

jQuery.parseJSON( jsonString );

É exatamente o que você está procurando (veja o jQuery documentação).

Editar:Esta resposta é para IE <7; para navegadores modernos, verifique a resposta de Jonathan acima.

Editar:Esta resposta está desatualizada e A resposta de Jonathan acima (JSON.parse(jsonString)) é agora o melhor resposta.

JSON.org possui analisadores JSON para vários idiomas, incluindo 4 diferentes para Javascript.Acredito que a maioria das pessoas consideraria json2.js sua implementação goto.

Use código simples representado a seguir link no MSDN.

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

e reverter

var str = JSON.stringify(arr);

Não tenho certeza sobre outras maneiras de fazer isso, mas aqui está como você faz isso Protótipo (tutorial JSON).

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

Chamando avaliarJSON() com true como o argumento limpa a string recebida.

Este parece ser o problema:

Uma entrada é recebida, via websocket ajax etc, e sempre estará no formato String - mas você precisa saber se é JSON.parsable.O problema é que se você sempre executá-lo através de um JSON.parse, o programa PODE continuar 'com sucesso', mas você ainda verá um erro lançado no console com o temido "Erro:token inesperado 'x'".

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

Se você estiver usando jQuery, você também pode simplesmente fazer $.getJSON(url, function(data) { });

Então você pode fazer coisas como data.key1.something, data.key1.something_else, etc.

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

O retorno de chamada recebe os dados retornados, que serão um objeto ou array JavaScript conforme definido pela estrutura JSON e analisados ​​usando o $.parseJSON() método.

Apenas por diversão, aqui está a maneira de usar a função:

 jsonObject = (new Function('return ' + jsonFormatData))()

Tente usar o método com este objeto Data.ex:Data='{result:true,count:1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

Este método realmente ajuda no Nodejs quando você está trabalhando com programação de porta serial

Usar JSON.parse é provavelmente a melhor maneira.Aqui está um exemplo demonstração ao vivo

var jsonRes = '{ "students" : [' +
          '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
          '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
          '{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);

A maneira mais fácil de usar parse() método:

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

então você pode obter os valores do Json elementos, por exemplo:

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;

Usando jQuery conforme descrito no documentação:

JSON.parse(jsonString);

Eu encontrei uma maneira "melhor":

No CoffeeScript:

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }

Em Javascript:

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});
JSON.parse(jsonString);

json.parse se transformará em objeto.

A análise JSON é sempre um problema.Se a entrada não for a esperada, ocorrerá um erro e travará o que você está fazendo.Você pode usar a seguinte pequena função para analisar sua entrada com segurança.Sempre transforma um objeto mesmo que a entrada não seja válida ou já seja um objeto que é melhor para a maioria dos casos.

JSON.safeParse = function (input, def) {
  // Convert null to empty object
  if (!input) {
    return def || {};
  } else if (Object.prototype.toString.call(input) === '[object Object]') {
    return input;
  }
  try {
    return JSON.parse(input);
  } catch (e) {
    return def || {};
  }
};

Converter o objeto em JSON e depois analisá-lo funciona para mim, como:

JSON.parse(JSON.stringify(object))

Se tivermos uma string como esta:"{" status ": 1, " token ": " 65b4352b2dfc4957a09add0ce5714059 "}", então podemos simplesmente usar json.parse duas vezes para converter esta string para um objeto json:

var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
var jsonString= JSON.parse(sampleString)
var jsonObject= JSON.parse(jsonString)

E simplesmente podemos extrair valores do objeto JSON usando:

    // instead of last JSON.parse:
    var { status, token } = JSON.parse(jsonString);

O resultado será:

status = 1 and token = 65b4352b2dfc4957a09add0ce5714059

JSON.parse() converte qualquer string JSON passada para a função em um objeto JSON.

Para melhor compreensão, pressione F12 para abrir Inspecionar elemento do seu navegador e vá para o console para escrever os seguintes comandos:-

var response = '{"result":true,"count":1}'; //sample json object(string form)
JSON.parse(response); //converts passed string to JSON Object.

Agora execute o comando: -

console.log(JSON.parse(response));

você obterá a saída como Object {resultado:verdade, conte:1}.

Para usar esse objeto, você pode atribuí-lo à variável, digamos obj: -

var obj = JSON.parse(response);

Agora, usando o operador obj e ponto (.), você pode acessar as propriedades do objeto JSON.

Tente executar o comando

console.log(obj.result);

Oficialmente documentado:

O JSON.parse() O método analisa uma string JSON, construindo o valor ou objeto JavaScript descrito pela string.Um opcional reviver função pode ser fornecida para realizar uma transformação no objeto resultante antes de ser retornado.

Sintaxe

JSON.parse(text[, reviver])

Parâmetros

texto

A string a ser analisada como JSON.Consulte o objeto JSON para obter uma descrição da sintaxe JSON.

reviver (opcional)

Se for uma função, prescreve como o valor originalmente produzido pela análise é transformado, antes de ser retornado.

Valor de retorno

O Object correspondente ao texto JSON fornecido.

Exceções

Lança uma exceção SyntaxError se a string a ser analisada não for JSON válida.

Você também pode usar reviver função para filtrar.

var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

para mais informações leia JSON.parse

Pergunta mais antiga, eu sei, porém ninguém percebe essa solução usando new Function(), uma função anônima que retorna os dados.


Apenas um exemplo:

 var oData = 'test1:"This is my object",test2:"This is my object"';

 if( typeof oData !== 'object' )
  try {
   oData = (new Function('return {'+oData+'};'))();
  }
  catch(e) { oData=false; }

 if( typeof oData !== 'object' )
  { alert( 'Error in code' ); }
 else {
        alert( oData.test1 );
        alert( oData.test2 );
      }

Isso é um pouco mais seguro porque é executado dentro de uma função e não é compilado diretamente no seu código.Portanto, se houver uma declaração de função dentro dela, ela não será vinculada ao objeto de janela padrão.

Eu uso isso para 'compilar' definições de configuração de elementos DOM (por exemplo, o atributo data) de forma simples e rápida.

Analise a string json com JSON.parse() e os dados se tornarão um objeto JavaScript.

JSON.parse(jsonString)

Aqui, JSON representa processar o conjunto de dados JSON.

Exemplo, imagine que recebemos este texto de um servidor da web:

'{ "name":"John", "age":30, "city":"New York"}'

Para analisar no objeto JSON:

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}'); 

Aqui obj é o respectivo objeto JSON que se parece com o seguinte.

{ "name":"John", "age":30, "city":"New York"}

Para buscar o valor usado.operador EXEMPLO:

obj.name // John
obj.age //30

Para transferir o oposto, converta um objeto JavaScript em uma string com JSON.stringify().

Resumo:

Javascript (navegador e NodeJS) possui um recurso integrado JSON objeto.Neste objeto estão 2 métodos convenientes para lidar com JSON.Eles são os seguintes:

  1. JSON.parse() Leva JSON como argumento, retorna objeto JS
  2. JSON.stringify() Toma o objeto JS como argumento retorna JSON objeto

Outras aplicações:

Além de lidar muito convenientemente com JSON eles podem ser usados ​​para outros meios.A combinação de ambos JSON métodos nos permite fazer clones profundos de arrays ou objetos muito facilmente.Por exemplo:

let arr1 = [1, 2, [3 ,4]];
let newArr = arr1.slice();

arr1[2][0] = 'changed'; 
console.log(newArr); // not a deep clone

let arr2 = [1, 2, [3 ,4]];
let newArrDeepclone = JSON.parse(JSON.stringify(arr2));

arr2[2][0] = 'changed'; 
console.log(newArrDeepclone); // A deep clone, values unchanged

Se o seu JavaScript estiver em Mootools o JSON.parse será Anônimo pelo Framework.
Um válido sintaxe Para transformar com segurança uma corda JSON em um objeto deve ser:

var object = JSON.decode(string[, secure]);

Além disso um JSON Request Isso pode gerar um objeto capaz de analisar diretamente.
Você pode saber como isso se transforma em dados brutos json aqui:

http://jsfiddle.net/chetabahana/qbx9b5pm/

Tente isto. Este está escrito em texto datilografado.

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top