2014-12-08 4 views
23

Ich importiere einige JSON-Dateien in mein Parse.com-Projekt und erhalte immer wieder den Fehler "ungültiger Schlüssel: Wertpaar".Warum ist JSON ungültig, wenn eine Ganzzahl mit 0 beginnt 0

Es besagt, dass es eine unerwartete "8" gibt.

Hier ist ein Beispiel meines JSON:

} 
"Manufacturer":"Manufacturer", 
"Model":"THIS IS A STRING", 
"Description":"", 
"ItemNumber":"Number12345", 
"UPC":083456789012, 
"Cost":"$0.00", 
"DealerPrice":" $0.00 ", 
"MSRP":" $0.00 ", 
} 

Wenn ich die JSON aktualisieren, indem entweder die 0 von "UPC":083456789012, entfernen oder es zu "UPC":"083456789012", Umwandlung es gültig wird.

Kann JSON wirklich keine ganze Zahl akzeptieren, die mit 0 beginnt, oder gibt es eine Möglichkeit, das Problem zu umgehen?

Danke,

+0

Die JSON-Syntax erlaubt es nicht, dass Zahlen mit der Ziffer 0 beginnen. Sie können Ihre Zahlen natürlich in Anführungszeichen setzen. – Pointy

+0

Eine Dezimalzahl, die mit einer Null beginnt, sollte eine Zeichenkette sein –

+0

Wenn Sie eine 0 haben, dann ist es höchstwahrscheinlich keine Ganzzahl, sondern ein Zeichenbezeichner. Behandle sie einfach als Saiten! –

Antwort

33

A 0 führende zeigt eine Oktalzahl in JavaScript. Eine Oktalzahl darf keine 8 enthalten, daher ist diese Zahl ungültig. Außerdem unterstützt JSON (offiziell) keine Oktalzahlen, daher ist der JSON formal ungültig, auch wenn die Zahl keine 8 enthält. Einige Parser unterstützen dies jedoch, was zu einiger Verwirrung führen kann. Andere Parser werden es als eine ungültige Sequenz erkennen und einen Fehler werfen, obwohl die genaue Erklärung, die sie geben, abweichen kann.

Lösung: Wenn Sie eine Nummer haben, speichern Sie sie niemals mit führenden Nullen. Wenn Sie einen Wert haben, der eine führende Null haben muss, behandeln Sie ihn nicht als Zahl, sondern als Zeichenfolge. Speichern Sie es in Anführungszeichen.

In diesem Fall haben Sie einen UPC, der needs to be 12 digits long und möglicherweise führende Nullen enthält. Ich denke, der beste Weg, es zu speichern, ist als eine Schnur.

Es ist jedoch fraglich. Wenn Sie es als Barcode behandeln, sehen Sie die führende 0 als einen integralen Teil davon, dann macht die Zeichenfolge Sinn. Andere Arten von Barcodes können sogar alphabetische Zeichen enthalten.

Auf der anderen Seite. Ein UPC ist eine Zahl, und die Tatsache, dass er links mit Nullen bis 12 Ziffern aufgefüllt ist, könnte als Anzeigeeigenschaft angesehen werden. Wenn Sie die Zahl auf 13 Stellen belassen, indem Sie eine zusätzliche 0 hinzufügen, haben Sie einen EAN-Code, denn EAN ist eine Obermenge von UPC.
Wenn Sie einen monatären Betrag haben, können Sie ihn als € 7.30 anzeigen, während Sie ihn als 7.3 speichern. Es kann also sinnvoll sein, einen Produktcode als Nummer zu speichern.

Aber diese Entscheidung liegt an Ihnen. Ich kann Ihnen nur raten, eine Zeichenfolge zu verwenden, die meine persönliche Vorliebe für diese Codes ist, und wenn Sie die Nummer wählen, müssen Sie die 0 entfernen, damit es funktioniert.

+0

Also wird jede Zahl, die mit einer "08" beginnen muss, immer ungültig sein? – DJSrA

+1

@DJSrA Es ist die führende '0', das ist das Problem. – Pointy

+1

So können Sie es zitieren "UPC": "083456789012", wenn es ein UPC-Barcode ist, sollten Sie es nicht als int analysieren. – Jonathan

6

Einer der verwirrenden Teile von JavaScript ist, dass, wenn eine Zahl mit einer 0 beginnt, die nicht unmittelbar von einer . gefolgt wird, es eine Oktalzahl, keine Dezimalzahl darstellt.

JSON lehnt sich an die JavaScript-Syntax an, vermeidet aber verwirrende Features, verbietet also einfach Zahlen mit führenden Nullen (es sei denn, danach folgt ein .).

Selbst wenn dies nicht der Fall war, gäbe es keinen Grund, die 0 noch in der Zahl zu erwarten, wenn es analysiert wurde seit 02 und 2 nur Unterschied Darstellungen derselben Zahl sind (wenn Sie Dezimal zwingen) .

Wenn die führende Null für Ihre Daten wichtig ist, dann haben Sie wahrscheinlich eine Zeichenfolge und keine Zahl.

"UPC":"083456789012" 

A product code ist eine Kennung, nicht etwas, das man mit Mathematik zu tun. Es sollte eine Zeichenfolge sein.

+0

Danke für die schnelle Antwort. – DJSrA

0

Wenn eine Ganzzahl mit 0 in JavaScript beginnt, wird sie als der Oktalwert (Basis 8) der Ganzzahl anstelle des Dezimalwerts (Basis 10) betrachtet. Zum Beispiel:

var a = 065; //Octal Value 
var b = 53; //Decimal Value 
a == b; //true 
+1

Abgesehen davon, dass es in JSON überhaupt nicht gültig ist ... Probieren Sie 'JSON.parse (" 65 ")' vs 'JSON.parse (" 065 ")' – CupawnTae

1

Formal ist es, weil JSON DecimalIntegerLiteral in seiner JSONNumber Produktion verwendet:

JSONNumber :: 
    -_opt DecimalIntegerLiteral JSONFraction_opt ExponentPart_opt 

Und DecimalIntegerLiteral nur mit 0 beginnen kann, wenn es 0 ist:

DecimalIntegerLiteral :: 
    0 
    NonZeroDigit DecimalDigits_opt 

Die Rationale hinter ist wahrscheinlich:

  • In der JSON-Grammatik - Konstrukte aus der Haupt-ECMAScript-Grammatik wiederverwenden.
  • In der Haupt-ECMAScript-Grammatik - zur besseren Unterscheidung DecimalIntegerLiteral von HexIntegerLiteral und OctalIntegerLiteral. OctalIntegerLiteral an erster Stelle.

Sehen Sie diese Produktionen:

HexIntegerLiteral :: 
    0x HexDigit 
    0X HexDigit 
    HexIntegerLiteral HexDigit 

...

OctalIntegerLiteral :: 
    0 OctalDigit 
    OctalIntegerLiteral OctalDigit 
+1

"Und DecimalIntegerLiteral darf nur mit 0 beginnen, wenn es 0 ist", oder hat einen Dezimalpunkt direkt hinter der "0" und einige weitere Ziffern – CupawnTae

+0

dank @lexicore. – DJSrA

+1

@CupawnTae Dies ist dann nicht 'DecimalIntegerLiteral'. – lexicore

0

Ich denke, der einfachste Weg, Ihre Anzahl von JSON zu senden ist Ihre Nummer als String senden.

+0

Es ist nicht oktal - es ist ein Code mit fester Länge und sollte als eine Zeichenfolge behandelt werden – CupawnTae

+0

ja, es gibt "8" und "9" in Zahlen. –

+0

Ja, das auch :-) – CupawnTae

1

Der UPC sollte im String-Format sein. Für die Zukunft können Sie auch andere UPC-Typen wie GS128 oder stringbasierte Produktidentifikationscodes erhalten. Stellen Sie Ihre DB-Spalte als Zeichenfolge ein.