Parte de la respuesta JSON de un sitio web tenía esto (... agregado para contexto):
{..., now:function(){return(new Date).getTime()}, ...}
¿Es válido agregar funciones anónimas a JSON? Esperaría que cada vez que acceda a 'tiempo' devuelva un valor diferente.
json
anonymous-function
Zachary Scott
fuente
fuente
JSON.parse('{now:function(){return(new Date).getTime()}')
. El inspector dice:Uncaught SyntaxError: Unexpected token n
Un vistazo rápido a la especificación JSON lo confirma. Concéntrese en la sección de 'valor'.Respuestas:
No.
JSON está destinado exclusivamente a ser un lenguaje de descripción de datos. Como se indica en http://www.json.org , es un "formato ligero de intercambio de datos". - no es un lenguaje de programación.
Según http://en.wikipedia.org/wiki/JSON , los "tipos básicos" admitidos son:
null
fuente
a==null?1:a.toString()==""
Lo que hace es decir si a = nulo, entonces devuelve 1 / verdadero, si es "", es decir, una cadena vacía, también obtiene 1 / verdadero ... si es no nulo o "", entonces devolverá 0 / falso, puedes replicar esto más para trabajar con [] y {} simplemente agregarlo?1:a==[]?1:a.toString()=={}.toString();
a mi fragmento anterior. así que tal vez esta función te ayude.isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})
Me gustaría utilizar?1:0
en lugar de?true:false
, pero (verdadero / falso)El problema es que JSON como lenguaje de definición de datos evolucionó a partir de JSON como una notación de objetos JavaScript. Dado que Javascript admite eval en JSON, es legítimo colocar código JSON dentro de JSON (en ese caso de uso). Si está utilizando JSON para pasar datos de forma remota, diría que es una mala práctica poner métodos en JSON porque es posible que no haya modelado bien su interacción cliente-servidor. Y, además, cuando desee utilizar JSON como lenguaje de descripción de datos, diría que podría meterse en problemas incorporando métodos porque algunos analizadores JSON se escribieron con solo la descripción de datos en mente y es posible que no admitan definiciones de métodos en la estructura.
La entrada JSON de Wikipedia es un buen caso para no incluir métodos en JSON, citando preocupaciones de seguridad:
fuente
Citemos una de las especificaciones: http://tools.ietf.org/html/rfc7159#section-12
La especificación de formato de intercambio de datos de la notación de objetos JavaScript (JSON) establece:
Entonces, todas las respuestas que dicen que las funciones no son parte del estándar JSON son correctas.
La respuesta oficial es: ¡ No, no es válido definir funciones en resultados JSON!
La respuesta podría ser sí, porque "el código son datos" y "los datos son códigos". Incluso si JSON se utiliza como formato de serialización de datos independiente del lenguaje, funcionará un túnel de "código" a través de otros tipos.
Se puede usar una cadena JSON para pasar una función JS al navegador del lado del cliente para su ejecución.
Esto lleva a preguntas como: Cómo " Ejecutar código JavaScript almacenado como una cadena ".
Esté preparado, para levantar su bandera "eval () is evil" y pegar su bandera "no tunelizar funciones a través de JSON" al lado.
fuente
No es estándar que yo sepa. Un vistazo rápido a http://json.org/ lo confirma.
fuente
No, definitivamente no.
Si usa un serializador JSON decente, no le permitirá serializar una función como esa. Es un OBJETO válido, pero no un JSON válido. Cualquiera que sea la intención de ese sitio web, no envía JSON válido.
fuente
JSON excluye explícitamente funciones porque no está destinado a ser una estructura de datos solo de JavaScript (a pesar del JS en el nombre).
fuente
Una respuesta corta es NO ...
Mira la razón por la cual:
Pero espera ...
Todavía hay formas de almacenar su función, generalmente no se recomienda hacerlo, pero aún es posible:
Dijimos, puede guardar un
string
... ¿qué tal convertir su función en una cadena, entonces?Luego puede secuenciar los datos usando
JSON.stringify(data)
y luego usandoJSON.parse
para analizarlos (si este paso es necesario) ...Y eval para ejecutar una función de cadena (antes de hacer eso, hágale saber que no se recomienda utilizar eval):
fuente
Mediante el uso de NodeJS (sintaxis commonJS) pude hacer que este tipo de funcionalidad funcionara, originalmente solo tenía una estructura JSON dentro de algún archivo JS externo, pero quería que esa estructura fuera más una clase, con métodos que podrían decidirse en tiempo de ejecución.
La declaración de 'Ejecutor' en myJSON no es necesaria.
fuente
Las expresiones de función en JSON son completamente posibles, pero no olvide ponerlas entre comillas dobles. Aquí hay un ejemplo tomado del diseño de la base de datos noSQL:
fuente
aunque no se recomienda eval, esto funciona:
fuente
Deja las comillas ...
fuente