2014-11-12 22 views
7

Dato il documento JSONI decimali senza zeri iniziali sono validi JSON?

{"percentageAmount": .01} 

L'esecuzione da JSONLint.com genera l'errore:

Parse error on line 2: 
..."percentageAmount": .01} 
-----------------------^ 
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[' 

D'altra parte, questo è valido:

{"percentageAmount": 0.01} 

Il codice è analizzato correttamente se assegnato a una variabile come un letterale JavaScript, ma naturalmente ci sono molte cose che sono OK per le variabili JavaScript che non sono spec. JSON.

Perché questo è contro JSON spec?

+3

Guardate la produzione 'number' a http://www.json.org/ – Barmar

+0

dal JSON sta per JavaScript Object Notation quindi è un sottoinsieme di javascript che dovrebbe validarlo normalmente. Forse perché json viene utilizzato per lo scambio di dati attraverso i server lato (php, asp) dove i valori .01 non sono validi – albanx

+1

In generale, JSON è un sottogruppo molto semplificato della notazione letterale Javascript. – Barmar

risposta

7

Are decimals without leading zeros valid JSON?

Da the specification:

number = [ minus ] int [ frac ] [ exp ] 

    decimal-point = %x2E  ; . 

    digit1-9 = %x31-39   ; 1-9 

    e = %x65/%x45   ; e E 

    exp = e [ minus/plus ] 1*DIGIT 

    frac = decimal-point 1*DIGIT 

    int = zero/(digit1-9 *DIGIT) 

    minus = %x2D    ; - 

    plus = %x2B    ; + 

    zero = %x30    ; 0 

L'unica parte di un numero che è obbligatorio è int che è definito come zero o 1-9 seguito da un numero di cifre.

Quindi JSON Lint è corretto.

Why is this against JSON spec?

Per quanto ne so, le ragioni dell'autore per definire in questo modo non sono documentate da nessuna parte.

10

No.

Secondo il railroad diagram for numbers at JSON.org, i numeri con valori frazionari devono avere cifre prima della virgola:

Diagram showing that numbers with fraction parts must have a digit before the decimal point.

+1

Amo questi diagrammi. Questo fornisce la risposta. – gfullam

+0

Se lo sto leggendo correttamente, uno 0 iniziale seguito da una cifra non è valido: vale a dire 000.1234 e 0123.45 non sono validi. Corretta? Non che io voglia inserire il codice deliberatamente in questo modo, ma le loro specifiche sono cattive. – user949300

+1

Beh nessuno di questi numeri è valido in JavaScript (SyntaxError) quindi mi sembra ragionevole. – maerics

Problemi correlati