sourcecode

정수가 선행 0으로 시작하는 경우 JSON이 유효하지 않은 이유는 무엇입니까?

codebag 2023. 4. 3. 21:28
반응형

정수가 선행 0으로 시작하는 경우 JSON이 유효하지 않은 이유는 무엇입니까?

Parse.com 프로젝트로 JSON 파일을 Import하고 있는데 "syslog key: value pair"라는 오류가 계속 나타납니다.

예기치 않은 "8"이 있음을 나타냅니다.

JSON의 예를 다음에 나타냅니다.

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

JSON을 업데이트하려면0부터"UPC":083456789012,또는 로 변환합니다."UPC":"083456789012",유효하게 됩니다.

JSON이 정말로 다음 문자로 시작하는 정수를 받아들이지 않을 수 있습니까?0아니면 문제를 해결할 방법이 있을까요?

선두 0은 JavaScript의 8진수를 나타냅니다.8진수에는 8을 포함할 수 없습니다.따라서 이 숫자는 유효하지 않습니다.게다가 JSON은 (공식적으로) 8진수를 지원하지 않기 때문에 8이 포함되지 않더라도 정식으로 JSON은 무효입니다.일부 파서들은 이를 지원하므로 혼란이 생길 수 있습니다.다른 파서는 잘못된 시퀀스로 인식하고 오류를 발생시킵니다. 단, 정확한 설명은 다를 수 있습니다.

솔루션:번호가 있으면 절대 선두에 0을 붙여 저장하지 마십시오.선행 0이 필요한 값이 있는 경우 숫자로 처리하지 말고 문자열로 처리하십시오.따옴표와 함께 보관하세요.

이 경우 UPC의 길이는 12자리여야 하며 선행 0이 포함될 수 있습니다.보관 방법은 끈으로 하는 것이 가장 좋다고 생각합니다.

하지만 그것은 논쟁의 여지가 있다.바코드로 취급하고 선행 0을 바코드의 일부로 간주하면 문자열이 의미가 있습니다.다른 유형의 바코드에는 알파벳 문자도 포함될 수 있습니다.

반면에.UPC는 숫자이며, 0에서 12자리까지 왼쪽 패드로 채워진 것은 디스플레이 속성으로 볼 수 있습니다.사실, 0을 더해서 13자리 숫자에 좌표를 붙이면 EAN 코드가 생성됩니다. EAN은 UPC의 슈퍼셋이기 때문입니다.

금액이 있는 경우 다음과 같이 표시할 수 있습니다.€ 7.30로서 보존하는 동안7.3따라서 제품 코드를 번호로 저장하는 것도 의미가 있습니다.

하지만 그 결정은 너에게 달렸어.이 코드들에 대한 제 개인적인 취향인 문자열을 사용하라는 조언만 드릴 수 있습니다. 만약 번호를 선택하신다면,0할 수 있을 것 같아요

JavaScript의 더 혼란스러운 부분 중 하나는 숫자가 다음 문자로 시작하는 경우0바로 뒤이어가 아니라,.는 소수점이 아닌 8진수를 나타냅니다.

JSON은 JavaScript 구문을 차용하지만 혼동을 피하기 위해 선행 0이 있는 숫자를 단순히 금지합니다(그 후가 아닌 경우)..」를 참조해 주세요.

그렇지 않다고 해도, 그 일이 일어날 거라고는 생각하지 않습니다.0그 이후 파싱될 때 아직 숫자에 남아 있다02그리고.2는 같은 숫자의 차이 표현일 뿐입니다(강제적으로 10진수를 사용하는 경우).

선행 0이 데이터에 중요한 경우 숫자가 아닌 문자열이 있을 수 있습니다.

"UPC":"083456789012"

제품 코드는 식별자이지 계산을 할 때 사용하는 것이 아닙니다.스트링일 거예요.

형식적으로는 JSON이DecimalIntegerLiteral그 안에JSONNumber실가동:

JSONNumber ::
    -_opt DecimalIntegerLiteral JSONFraction_opt ExponentPart_opt

그리고.DecimalIntegerLiteral로만 시작할 수 있다0그렇다면0:

DecimalIntegerLiteral ::
    0
    NonZeroDigit DecimalDigits_opt

그 배경은 다음과 같습니다.

  • JSON 문법 - 메인 ECMAScript 문법의 구문을 재사용합니다.
  • 주요 ECMAScript 문법 - 쉽게 구분할 수 있도록 하기 위해DecimalIntegerLiteral부터HexIntegerLiteral그리고.OctalIntegerLiteral.OctalIntegerLiteral애초에.

다음 제품 참조:

 HexIntegerLiteral ::
     0x HexDigit
     0X HexDigit
    HexIntegerLiteral HexDigit

...

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

UPC는 문자열 형식이어야 합니다.향후 GS128이나 문자열 기반의 제품 식별 코드 등 다른 유형의 UPC도 취득할 수 있습니다.DB 열을 문자열로 설정합니다.

정수가 로 시작하는 경우0JavaScript에서는 10진수(base 10) 값이 아닌 정수의 Octal(base 8) 값으로 간주됩니다.예를 들어 다음과 같습니다.

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

번호를 JSON으로 보내는 가장 쉬운 방법은 번호를 문자열로 보내는 것이라고 생각합니다.

언급URL : https://stackoverflow.com/questions/27361565/why-is-json-invalid-if-an-integer-begins-with-a-leading-zero

반응형