2010-01-04 12 views
85

Parte de la respuesta JSON de una página web tenía esto (... añadido para el contexto):¿Es válido para definir funciones en los resultados JSON?

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

es la adición de funciones anónimas a JSON válida? Esperaría cada vez que accedas a 'tiempo' para devolver un valor diferente.

+0

¿El JSON analizar con éxito por el navegador? Si es así, entonces sí es válido (en ese sentido). – harschware

+7

@harschware: eso es cierto solo cuando JSON se relaciona con javascript. Como formato de serialización de datos independientes del idioma, es falso y es un camino problemático para caminar. – jsoverson

+0

@jsoverson - Estoy de acuerdo. Ver mi respuesta a continuación. – harschware

Respuesta

90

No.

JSON es puramente destinado 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.

por http://en.wikipedia.org/wiki/JSON, los "tipos básicos" soportados son:

  • número (entero, real, o flotando punto)
  • String (entre comillas dobles Unicode con barra invertida de escape)
  • booleana (verdadero y falso)
  • matriz (una secuencia de valores ordenada, separada por comas y entre corchetes)
  • Object (colección de clave: Valor pares, separados por comas y cerrado entre llaves)
  • null
+0

¿Es [], {} igual a nulo? Sé que nada es comparable a nulo, incluido el nulo, pero ¿se evalúa un conjunto vacío como un valor nulo? –

+2

@Dr. Zim, no, y para comparar cosas para anular lo que hago es esto 'a == null? 1: a.toString() ==" "' Lo que hace es decir si a = null, entonces devuelve 1/verdadero, si es "", que significa cadena vacía, también obtienes 1/verdadero ... si no es nulo o "", entonces devolverá 0/falso, puedes replicar esto para trabajar con [] y {} simplemente agregando '? 1: a == []? 1: a.toString() == {}. ToString(); 'a mi fragmento anterior. entonces quizás esta función te ayude. 'isnull = (function (a) {return (a == null? 1: a.toString() ==" "? 1: a == []? 1: a.toString() == {}. toString ())? true: false}) 'Yo usaría'? 1: 0' en lugar de '?verdadero: falso' pero (verdadero/falso) –

+0

es correcto para la función de JavaScript estándar –

3

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

4

Nop, definitivamente no.

Si utiliza 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.

+2

Uso JSON -Lib y considera que es un gran serializador. Desde la [página de uso] (json-lib.sourceforge.net/usage.html) puedes ver que serializará funciones muy bien – harschware

+0

Interesante ... Nunca he visto eso antes. Definitivamente no es una especificación (http://www.json.org/ declara explícitamente que JSON es independiente del lenguaje, las definiciones de funciones no lo son), pero de todos modos es interesante. – jvenema

+0

Es curioso que se supone que es independiente del lenguaje, pero JSON para la notación de objetos JavaScript hmm extraño ... –

16

El problema es que JSON como lenguaje de definición de datos surgió 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.

Wikipedia JSON entry hace un buen caso para no incluir métodos en JSON, alegando motivos de seguridad:

Unless you absolutely trust the source of the text, and you have a need to parse and accept text that is not strictly JSON compliant, you should avoid eval() and use JSON.parse() or another JSON specific parser instead. A JSON parser will recognize only JSON text and will reject other text, which could contain malevolent JavaScript. In browsers that provide native JSON support, JSON parsers are also much faster than eval. It is expected that native JSON support will be included in the next ECMAScript standard.

+1

Puede estar usando el término JSON coloquialmente, pero oficialmente "JSON" es un estándar de ECMA que no contiene los objetos de la función que se codificarán. No debe haber ambigüedad. a las capacidades a las que se refiere cuando dice "JSON": ese es el "punto" de tener un estándar. –

+0

De acuerdo que es cierto hoy. No tengo una fuente para citar, pero creo que JSON fue un término acuñado antes de que ECMA entrara en el juego Javascript, y antes de que JSON fuera un formato estándar de intercambio de datos ... de ahí que utilicé el término 'evolucionado' – harschware

7

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

El La JavaScript Object Notation (JSON) Intercambio de Datos Formato Especificación estados:

JSON is a subset of JavaScript but excludes assignment and invocation.

Since JSON's syntax is borrowed from JavaScript, it is possible to use that language's "eval()" function to parse JSON texts. This generally constitutes an unacceptable security risk, since the text
could contain executable code along with data declarations
. The same consideration applies to the use of eval()-like functions in any other programming language in which JSON texts conform to that
language's syntax.

So todas las respuestas que indican que las funciones no son parte del estándar JSON son correctas.

La respuesta oficial es: No, no es válida para definir funciones en los resultados JSON!


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

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

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

Esto conduce a la pregunta de como: ¿Cómo a "Execute JavaScript code stored as a string".

Esté preparado, para elevar su "eval() es malo" bandera y meter la bandera de "No funciones túnel a través de JSON" al lado de él.

-1

Dejar las cotizaciones fuera ...

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

a.b(); 
-1

expresiones de función en el JSON son completamente posible, pero no te olvides de envolverlo entre comillas dobles. Aquí está un ejemplo tomado de la base de datos NoSQL diseño:

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

+0

La pregunta es sobre una función, no una cadena. JSON admite valores de cadena, pero no admite funciones. Vea [la respuesta de Mike] (https://stackoverflow.com/a/2001471/4494577) para detalles – jannis

Cuestiones relacionadas