2010-01-04 1 views
85

Parte della risposta JSON di un sito web ha avuto questo (... aggiunto per il contesto):È valido definire le funzioni nei risultati JSON?

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

è l'aggiunta di funzioni anonime a JSON valido? Mi aspetterei ogni volta che accedi al "tempo" per restituire un valore diverso.

+0

ha fatto il JSON analizzare correttamente dal browser? Se è così allora sì è valido (in tal senso). – harschware

+7

@harschware: è vero solo se JSON si riferisce a javascript. Essendo un formato di serializzazione dei dati indipendente dalla lingua, è falso ed è una strada problematica da percorrere. – jsoverson

+0

@jsoverson - Sono d'accordo. Vedi la mia risposta qui sotto. – harschware

risposta

90

No.

JSON puramente è destinata ad essere un linguaggio di descrizione di dati. Come indicato su http://www.json.org, è un "formato di interscambio dati leggero". - non un linguaggio di programmazione.

Per http://en.wikipedia.org/wiki/JSON, i "tipi di base" supportati sono:

  • Numero (intero, reale, o galleggianti punto)
  • String (doppio citato Unicode con backslash fuga)
  • booleano (vero e falso)
  • Matrice (una sequenza di valori ordinata, separati da virgola e racchiusi tra parentesi quadre)
  • oggetto (raccolta di chiave: valore coppie, separati da virgole e racchiuse tra parentesi graffe )
  • null
+0

È [], {} uguale a null? So che nulla è paragonabile a null, incluso null, ma è un insieme vuoto valutato come valore nullo? –

+2

@Dr. Zim, no e per confrontare le cose con null quello che faccio è questo 'a == null? 1: a.toString() ==" "' Ciò che fa è che dice a = null allora restituisce 1/true, se è "" che significa stringa vuota anche tu ottieni 1/true .. se non è nullo o "" allora restituirà 0/falso, puoi replicarlo di più per lavorare con [] e {} semplicemente aggiungendo '? 1: a == []? 1: a.toString() == {}. ToString(); 'al mio snippet precedente. quindi forse questa funzione ti aiuterà. 'isnull = (function (a) {return (a == null? 1: a.toString() ==" "? 1: a == []? 1: a.toString() == {}. toString ())? true: false}) 'Userei'? 1: 0' invece di '?true: false' ma (vero/falso) –

+0

è corretto per la funzione javascript standard –

3

JSON esclude esplicitamente le funzioni poiché non si intende che sia una struttura di dati solo JavaScript (nonostante il JS nel nome).

4

No, sicuramente non.

Se si utilizza un serializzatore JSON decente, non consente di serializzare una funzione del genere. È un OGGETTO valido, ma non è valido JSON. Qualunque intento di quel sito, non sta inviando JSON valido.

+2

Io uso JSON -Lib e considera un ottimo serializzatore Dalla pagina di utilizzo (json-lib.sourceforge.net/usage.html) puoi vedere che serializzerà le funzioni semplicemente – harschware

+0

Interessante ... Non l'ho mai visto non è spec. (http://www.json.org/ afferma esplicitamente che JSON è indipendente dalla lingua, quali definizioni di funzioni non lo sono), ma comunque interessante. – jvenema

+0

È buffo che si suppone che sia indipendente dalla lingua, ma gli stand JSON per JavaScript Object Notation hmm weird .. –

16

Il problema è che JSON come linguaggio di definizione dei dati si è sviluppato da JSON come Notazione oggetto JavaScript. Poiché Javascript supporta eval su JSON, è legittimo inserire il codice JSON all'interno di JSON (in tale caso d'uso). Se utilizzi JSON per trasmettere dati in remoto, direi che è una cattiva pratica mettere i metodi nel JSON perché potresti non aver modellato bene l'interazione client-server. Inoltre, quando si desidera utilizzare JSON come linguaggio di descrizione dei dati, direi che potresti metterti nei guai incorporando metodi perché alcuni parser JSON sono stati scritti tenendo a mente solo la descrizione dei dati e potrebbero non supportare le definizioni dei metodi nella struttura.

Wikipedia JSON entry rende un buon caso per non apporre metodi in JSON, citando preoccupazioni per la sicurezza:

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

Si può usare il termine JSON in modo colloquiale, ma ufficialmente "JSON" è uno standard ECMA che non mette a nudo gli oggetti funzione da codificare. Non ci dovrebbero essere ambiguità le capacità a cui ti riferisci quando dici "JSON" - questo è il "tutto punto" di avere uno standard. –

+0

Concordato che è vero oggi. Non ho una fonte da citare, ma credo che JSON fosse un termine coniato prima che ECMA entrasse nel gioco Javascript, e prima che JSON fosse un formato standard per lo scambio di dati ... quindi ho usato il termine 'evoluto' – harschware

7

Let citare uno delle specifiche del - http://tools.ietf.org/html/rfc7159#section-12

Il La JavaScript Object Notation (JSON) Data Interchange Formato Specifica Stati:

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.

Quindi tutte le risposte che dichiarano, che le funzioni non fanno parte dello standard JSON sono corrette.

La risposta ufficiale è: No, non è valido per definire le funzioni nei risultati JSON!


La risposta potrebbe essere sì, perché "il codice è di dati" e "i dati è il codice". Anche se JSON viene utilizzato come formato di serializzazione dei dati indipendente dalla lingua, funzionerà un tunneling di "codice" tramite altri tipi.

Una stringa JSON può essere utilizzata per passare una funzione JS al browser lato client per l'esecuzione.

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

Questo porta a mettere in discussione come: come "Execute JavaScript code stored as a string".

Preparatevi, per aumentare la vostra bandiera "eval() è male" e attaccate la bandiera "non traforo attraverso JSON" accanto ad essa.

-1

lasciare le citazioni fuori ...

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

a.b(); 
-1

espressioni di funzione in JSON sono completamente possibile, basta non dimenticare di avvolgerla in doppi apici. Ecco un esempio preso dalla progettazione di database NoSQL:

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

+0

La domanda è su una funzione non una stringa. JSON supporta i valori stringa, ma non supporta le funzioni. Vedi [risposta di Mike] (https://stackoverflow.com/a/2001471/4494577) per i dettagli – jannis