web-dev-qa-db-ja.com

整数が先頭のゼロで始まる場合、なぜJSONは無効ですか?

Parse.comプロジェクトにいくつかのJSONファイルをインポートしていますが、「無効なキー:値のペア」というエラーが引き続き発生します。

予期しない「8」があることを示しています。

JSONの例を次に示します。

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

0から"UPC":083456789012,を削除するか、"UPC":"083456789012",に変換してJSONを更新すると、有効になります。

JSONは0で始まる整数を実際に受け入れられないのでしょうか、それとも問題を回避する方法はありますか?

36
DJSrA

先頭の0は、JavaScriptの8進数を示します。 8進数に8を含めることはできません。したがって、その番号は無効です。さらに、JSONは(公式に)8進数をサポートしていないため、8が含まれていない場合でも、正式にはJSONは無効です。他のパーサーはそれを無効なシーケンスとして認識し、エラーをスローしますが、正確な説明は異なる場合があります。

解決策:数値がある場合は、先頭にゼロを付けて格納しないでください。先行ゼロが必要な値がある場合は、数値としてではなく、文字列として扱います。引用符で囲んで保存します。

この場合、UPC which 12桁の長さが必要です があり、先頭にゼロが含まれている可能性があります。文字列。

ただし、議論の余地があります。それをバーコードとして扱い、先頭の0をその一部として見れば、文字列は理にかなっています。他のタイプのバーコードには、アルファベット文字を含めることもできます。

一方。 A UPCは数字であり、12桁までゼロで左詰めされているという事実は、表示プロパティとして見ることができます。実際に、 EANはUPCのスーパーセットであるため、余分な0、EANコードがあります。

金額がある場合は、€ 7.30として保存し、7.3として保存すると、製品コードを数値として保存することもできます。

しかし、その決定はあなた次第です。これらのコードの個人的な好みである文字列を使用することをお勧めします。数字を選択した場合は、0を削除して機能させる必要があります。

53
GolezTrol

JavaScriptのより複雑な部分の1つは、数値が0が直後に続かない.で始まる場合、10進数ではなく8進数を表すことです。

JSONはJavaScriptシンタックスから借用していますが、混乱を招く機能を回避しているため、先頭にゼロを付けた数字を禁止します(その後に.が続く場合を除きます)。

これが当てはまらなかったとしても、002は単なる差分表現であるため、2が解析されたときにまだ数値にあると期待する理由はありません。同じ数字(10進数を強制する場合)。

先行ゼロがデータにとって重要な場合、おそらく数字ではなく文字列があります。

"UPC":"083456789012"

製品コード は識別子であり、数学を行うものではありません。文字列でなければなりません。

8
Quentin

UPCは文字列形式である必要があります。将来的には、GS128や文字列ベースの製品識別コードなど、他のタイプのUPCも取得できます。文字列にする列。

1
causita

正式には、JSONはDecimalIntegerLiteral生成でJSONNumberを使用するためです。

JSONNumber ::
    -_opt DecimalIntegerLiteral JSONFraction_opt ExponentPart_opt

DecimalIntegerLiteralは、0の場合にのみ0で始まる場合があります。

DecimalIntegerLiteral ::
    0
    NonZeroDigit DecimalDigits_opt

背後にある理論的根拠はおそらく次のとおりです。

  • JSON文法で-メインECMAScript文法からの構成を再利用します。
  • メインのECMAScript文法-DecimalIntegerLiteralHexIntegerLiteralおよびOctalIntegerLiteralを区別しやすくするため。 OctalIntegerLiteralそもそも。

この作品を見る:

 HexIntegerLiteral ::
     0x HexDigit
     0X HexDigit
    HexIntegerLiteral HexDigit

...

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit
1
lexicore

JavaScriptで0で始まる整数は、10進数(10進数)ではなく、整数の8進数(8進数)の値と見なされます。例えば:

var a = 065; //Octal Value
var b = 53;  //Decimal Value
a == b; //true
0
tantalum

JSONで番号を送信する最も簡単な方法は、文字列として番号を送信することだと思います。

0
Alireza MH