Uma abordagem que eu gosto de usar é preencher / envolver o json com um literal de objeto e salvar o arquivo com uma extensão de arquivo .jsonp. Esse método também mantém o arquivo json original (test.json) inalterado, pois você estará trabalhando com o novo arquivo jsonp (test.jsonp). O nome no wrapper pode ser qualquer coisa, mas precisa ser o mesmo nome da função de retorno de chamada usada para processar o jsonp. Usarei seu test.json postado como um exemplo para mostrar a adição do wrapper jsonp para o arquivo 'test.jsonp'.
json_callback({"a" : "b", "c" : "d"});
Em seguida, crie uma variável reutilizável com escopo global em seu script para manter o JSON retornado. Isso tornará os dados JSON retornados disponíveis para todas as outras funções em seu script, em vez de apenas a função de retorno de chamada.
var myJSON;
Em seguida, vem uma função simples para recuperar seu json por injeção de script. Observe que não podemos usar o jQuery aqui para anexar o script ao cabeçalho do documento, pois o IE não suporta o método .append do jQuery. O método jQuery comentado no código abaixo funcionará em outros navegadores que suportam o método .append. Está incluído como referência para mostrar a diferença.
function getLocalJSON(json_url){
var json_script = document.createElement('script');
json_script.type = 'text/javascript';
json_script.src = json_url;
json_script.id = 'json_script';
document.getElementsByTagName('head')[0].appendChild(json_script);
// $('head')[0].append(json_script); DOES NOT WORK in IE (.append method not supported)
}
A seguir, é apresentada uma função de retorno de chamada curta e simples (com o mesmo nome do wrapper jsonp) para obter os dados dos resultados do json na variável global.
function json_callback(response){
myJSON = response; // Clone response JSON to myJSON object
$('#json_script').remove(); // Remove json_script from the document
}
Os dados json agora podem ser acessados por qualquer função do script usando a notação de ponto. Como um exemplo:
console.log(myJSON.a); // Outputs 'b' to console
console.log(myJSON.c); // Outputs 'd' to console
Esse método pode ser um pouco diferente do que você está acostumado a ver, mas tem muitas vantagens. Primeiro, o mesmo arquivo jsonp pode ser carregado localmente ou em um servidor usando as mesmas funções. Como um bônus, o jsonp já está em um formato compatível com vários domínios e também pode ser facilmente usado com APIs do tipo REST.
Concedido, não há funções de tratamento de erros, mas por que você precisaria de uma? Se você não conseguir obter os dados do json usando esse método, pode apostar que tem alguns problemas no próprio json, e eu verificaria isso em um bom validador JSON.
JSON
string, você já está recuperando um objeto javascript, não precisa usareval()
.