Parte da resposta JSON de um site tinha este (... adicionado para contexto):
{..., now:function(){return(new Date).getTime()}, ...}
Adicionar funções anônimas ao JSON é válido? Eu esperaria que cada vez que você acessar 'tempo' retornasse um valor diferente.
json
anonymous-function
Zachary Scott
fonte
fonte
JSON.parse('{now:function(){return(new Date).getTime()}')
. O inspetor diz:Uncaught SyntaxError: Unexpected token n
Uma rápida olhada na especificação JSON confirma isso. Concentre-se na seção 'valor'.Respostas:
Não.
JSON pretende ser puramente uma linguagem de descrição de dados. Conforme observado em http://www.json.org , é um "formato de intercâmbio de dados leve". - não é uma linguagem de programação.
Por http://en.wikipedia.org/wiki/JSON , os "tipos básicos" suportados são:
null
fonte
a==null?1:a.toString()==""
O que isso faz é dizer se a = null então retorna 1 / verdadeiro, se for "" significando string vazia você também obtém 1 / verdadeiro .. se for not null ou "" então ele retornará 0 / false, você pode replicar mais isso para trabalhar com [] e {} simplesmente adicionar?1:a==[]?1:a.toString()=={}.toString();
ao meu snippet anterior. então talvez esta função ajude você.isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})
Eu usaria em?1:0
vez de?true:false
but (true / false)O problema é que o JSON como uma linguagem de definição de dados evoluiu do JSON como um JavaScript Object Notation. Como o Javascript oferece suporte a eval em JSON, é legítimo colocar o código JSON dentro de JSON (nesse caso de uso). Se você estiver usando JSON para passar dados remotamente, eu diria que é uma má prática colocar métodos no JSON porque você pode não ter modelado bem sua interação cliente-servidor. E, além disso, ao desejar usar JSON como uma linguagem de descrição de dados, eu diria que você poderia ter problemas ao incorporar métodos porque alguns analisadores JSON foram escritos apenas com a descrição de dados em mente e podem não suportar definições de método na estrutura.
A entrada JSON da Wikipedia é um bom caso para não incluir métodos em JSON, citando questões de segurança:
fonte
Vamos citar uma das especificações - http://tools.ietf.org/html/rfc7159#section-12
A especificação do formato de intercâmbio de dados do JavaScript Object Notation (JSON) afirma:
Portanto, todas as respostas que afirmam, que funções não fazem parte do padrão JSON estão corretas.
A resposta oficial é: Não, não é válido definir funções em resultados JSON!
A resposta poderia ser sim, porque "código são dados" e "dados são código". Mesmo se JSON for usado como um formato de serialização de dados independente de linguagem, um tunelamento de "código" por meio de outros tipos funcionará.
Uma string JSON pode ser usada para passar uma função JS para o navegador do lado do cliente para execução.
Isso leva a questões como: Como " Executar código JavaScript armazenado como string ".
Esteja preparado para levantar o sinalizador "eval () é mau" e colar o sinalizador "não criar túnel de funções por meio de JSON" ao lado dele.
fonte
Não é padrão, tanto quanto eu sei. Uma rápida olhada em http://json.org/ confirma isso.
fonte
Não, definitivamente não.
Se você usar um serializador JSON decente, ele não permitirá que você serialize uma função como essa. É um OBJETO válido, mas não um JSON válido. Qualquer que seja a intenção do site, ele não está enviando um JSON válido.
fonte
JSON exclui funções explicitamente porque não se destina a ser uma estrutura de dados somente JavaScript (apesar do JS no nome).
fonte
Uma resposta curta é NÃO ...
Veja o motivo:
Mas espere ...
Ainda há maneiras de armazenar sua função, é amplamente não recomendado para isso, mas ainda é possível:
Dissemos, você pode salvar um
string
... que tal converter sua função em uma string então?Em seguida, você pode stringificar os dados usando
JSON.stringify(data)
e, em seguida, usandoJSON.parse
para analisá-los (se esta etapa for necessária) ...E eval para executar uma função de string (antes de fazer isso, informe o uso de eval amplamente não recomendado):
fonte
Usando NodeJS (sintaxe commonJS), consegui fazer esse tipo de funcionalidade funcionar, originalmente tinha apenas uma estrutura JSON dentro de algum arquivo JS externo, mas queria que essa estrutura fosse mais uma classe, com métodos que poderiam ser decididos em tempo de execução.
A declaração de 'Executor' em myJSON não é necessária.
fonte
Expressões de funções no JSON são completamente possíveis, mas não se esqueça de colocá-las entre aspas duplas. Aqui está um exemplo tirado do design do banco de dados noSQL:
fonte
embora eval não seja recomendado, isso funciona:
fonte
Deixe as aspas fora ...
fonte