¿Es válido para definir funciones en los resultados de JSON?

Parte de la respuesta JSON de un sitio web tenía esto (… agregado para el contexto):

{..., now:function(){return(new Date).getTime()}, ...} 

¿Es válido agregar funciones anónimas a JSON? Esperaría cada vez que accedas a ‘tiempo’ para devolver un valor diferente.

No.

JSON es puramente para ser un lenguaje de descripción de datos. Como se indica en http://www.json.org , es un “formato liviano de intercambio de datos”. – no es un lenguaje de progtwigción.

Según http://en.wikipedia.org/wiki/JSON , los “tipos básicos” soportados son:

  • Número (entero, real o punto flotante)
  • Cadena (Unicode de comillas dobles con escape de barra invertida)
  • Booleano (verdadero y falso)
  • Array (una secuencia ordenada de valores, separados por comas y entre corchetes)
  • Objeto (colección de pares clave: valor, separados por comas y entre llaves)
  • null

El problema es que JSON como lenguaje de definición de datos evolucionó a partir de JSON como una notación de objetos JavaScript. Como Javascript admite eval en JSON, es legítimo poner código JSON dentro de JSON (en ese caso de uso). Si está utilizando JSON para pasar datos de forma remota, entonces diría que es una mala práctica poner métodos en el JSON porque es posible que no haya modelado bien la interacción cliente-servidor. Y, además, cuando desee usar JSON como lenguaje de descripción de datos, diría que podría meterse en problemas mediante la incrustación de métodos porque algunos analizadores de JSON se escribieron con solo la descripción de datos en mente y es posible que no admita definiciones de métodos en la estructura.

La entrada de Wikipedia JSON es un buen argumento para no incluir métodos en JSON, y menciona las preocupaciones de seguridad:

A menos que confíe plenamente en el origen del texto y tenga la necesidad de analizar y aceptar texto que no sea estrictamente compatible con JSON, debe evitar eval () y usar JSON.parse () u otro analizador específico de JSON. Un analizador JSON reconocerá solo el texto JSON y rechazará otro texto, que podría contener un malévolo JavaScript. En los navegadores que brindan soporte nativo de JSON, los analizadores de JSON también son mucho más rápidos que eval. Se espera que el soporte JSON nativo se incluya en el próximo estándar ECMAScript.

No es estándar por lo que yo sé. Una mirada rápida a http://json.org/ confirma esto.

Citemos una de las especificaciones: http://tools.ietf.org/html/rfc7159#section-12

La Especificación de formato de intercambio de datos de JavaScript Object Notation (JSON) establece:

JSON es un subconjunto de JavaScript pero excluye la asignación y la invocación.

Como la syntax de JSON se toma prestada de JavaScript, es posible utilizar la función “eval ()” de ese idioma para analizar textos JSON. Esto generalmente constituye un riesgo de seguridad inaceptable, ya que el texto
podría contener código ejecutable junto con declaraciones de datos . La misma consideración se aplica al uso de funciones similares a eval () en cualquier otro lenguaje de progtwigción en el que los textos JSON se ajusten a ese
syntax del lenguaje

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 para definir funciones en los resultados de JSON!


La respuesta podría ser sí, porque “el código es datos” y “los datos son códigos”. Incluso si JSON se utiliza como un formato de serialización de datos independiente del idioma, funcionará un túnel de “código” a través de otros tipos.

Una cadena JSON podría usarse para pasar una función JS al navegador del lado del cliente para su ejecución.

 [{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}] 

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 “do not tunnel functions by JSON” (No haga túneles a través de JSON) al lado.

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 es JSON válido. Cualquiera que sea la intención de ese sitio web, no está enviando un JSON válido.

JSON explícitamente excluye funciones porque no está destinado a ser una estructura de datos solo de JavaScript (a pesar del JS en el nombre).

Una respuesta corta es NO

JSON es un formato de texto que es completamente independiente del lenguaje, pero utiliza convenciones que son familiares para los progtwigdores de la familia C de idiomas, incluidos C, C ++, C #, Java, JavaScript, Perl, Python y muchos otros. Estas propiedades hacen de JSON un lenguaje ideal de intercambio de datos.

Mira la razón por la cual:

Al intercambiar datos entre un navegador y un servidor, los datos solo pueden ser texto.

JSON es texto, y podemos convertir cualquier objeto JavaScript en JSON y enviar JSON al servidor.

También podemos convertir cualquier JSON recibido del servidor en objetos JavaScript.

De esta forma podemos trabajar con los datos como objetos de JavaScript, sin análisis ni traducciones complicadas.

Pero espera

Todavía hay maneras de almacenar su función, no se recomienda ampliamente para eso, pero aún es posible:

Dijimos que puedes guardar una string … ¿qué tal convertir tu función en una cadena?

 const data = {func: '()=>"a FUNC"'}; 

Luego puede stringificar datos usando JSON.stringify(data) y luego usar JSON.parse para analizarlo (si este paso es necesario) …

Y eval para ejecutar una función de cadena (antes de hacer eso, solo se lo debe informar usando ampliamente eval no recomendado):

 eval(data.func)(); //return "a FUNC" 

Deja las cotizaciones …

 var a = {"b":function(){alert('hello world');} }; ab(); 

Las expresiones de función en el JSON son completamente posibles, simplemente no olvide envolverlo entre comillas dobles. Aquí hay un ejemplo tomado del diseño de la base de datos no SQL:

 { "_id": "_design/testdb", "views": { "byName": { "map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}" } } } 
    Intereting Posts