JSON은 Infinity와 NaN을 생략했습니다. ECMAScript에서 JSON 상태는?
JSON이 왜 NaN과 +/- Infinity를 빼먹었는지 알아?Javascript는 NaN 또는 +/- 무한대 값을 포함하는 경우 직렬화할 수 있는 개체가 아닌 이상한 상황에 놓입니다.
RFC 4627 및 ECMA-262(섹션 24.5.2, JSON.stringify, 메모 4, 마지막 편집 시 ECMA-262 pdf 683 페이지)를 참조해 주세요.
는, 「이행」을 호출하는 됩니다.
ToString(number)
기호에 관계없이 NaN과 Infinity는 String으로 표시됩니다.null
.
Infinity
★★★★★★★★★★★★★★★★★」NaN
것은 입니다.undefined
변경 가능합니다. 수 .JSON의 EcmaScript입니다.eval(jsonString)
★★★★★★★★★★★★★★★★★」JSON.parse(jsonString)
.
만약 그것이 허락된다면 누군가는 다음과 같은 코드를 주입할 수 있을 것이다.
NaN={valueOf:function(){ do evil }};
Infinity={valueOf:function(){ do evil }};
포럼(또는 그 무엇)으로 이행하면, 그 사이트의 json 의 사용이 침해될 가능성이 있습니다.
첫 번째 질문에 대해서:이것은 JSON에서는 유감스러운 누락이라는 점에서 사용자 "cbare"에 동의합니다.IEEE754에서는 부동소수점 숫자의 3가지 특별한 값으로 정의하고 있습니다.따라서 JSON은 IEEE754 부동소수점 번호를 완전히 나타낼 수 없습니다.ECMA262 5.1에서 정의된 JSON은 번호가 IEEE754에 기반하는지 여부조차 정의하지 않기 때문에 실제로는 더 심각합니다.ECMA262의 stringify() 함수에 대해 기술된 설계 흐름에는 3개의 특별한 IEEE 값이 기재되어 있기 때문에 실제로는 IEEE754 부동소수점 번호를 지원하기 위한 것이었을 것으로 생각할 수 있습니다.
다른 데이터 포인트로는 XML 데이터 타입 xs:float 및 xs:double do는 IEEE754 부동소수점 숫자에 기반하고 있음을 나타냅니다(W3C XSD 1.0 Part 2, Datatypes 참조).
null 객체 패턴을 조정하고 JSON에서 다음과 같은 값을 나타낼 수 있습니까?
"myNum" : {
"isNaN" :false,
"isInfinity" :true
}
그러면 확인할 때 유형을 확인할 수 있습니다.
if (typeof(myObj.myNum) == 'number') {/* do this */}
else if (myObj.myNum.isNaN) {/* do that*/}
else if (myObj.myNum.isInfinity) {/* Do another thing */}
Java 에서는, 이러한 기능을 실장하기 위해서, 시리얼라이제이션 방식을 무효로 할 수 있는 것을 알고 있습니다.어디서 시리얼라이즈를 하는지 알 수 없기 때문에 시리얼라이제이션 방법에 대한 자세한 내용은 말씀드릴 수 없습니다.
문자열 "Infinity", "-Infinity" 및 "NaN"은 모두 JS에서 예상되는 값으로 강제됩니다.따라서 JSON에서 이러한 값을 표현하는 올바른 방법은 문자열입니다.
> +"Infinity"
Infinity
> +"-Infinity"
-Infinity
> +"NaN"
NaN
JSON.stringify가 디폴트로 이 기능을 하지 않는 것은 유감입니다.하지만 방법이 있습니다.
> JSON.stringify({ x: Infinity }, function (k,v) { return v === Infinity ? "Infinity" : v; })
"{"x":"Infinity"}"
직렬화 코드에 액세스할 수 있는 경우 Infinity를 1.0e+1024로 나타낼 수 있습니다.지수가 너무 커서 이중으로 나타낼 수 없으며, 역직렬화되면 무한대로 표시됩니다.다른 json 파서에 대한 확신이 없는 웹킷에서 작동합니다!
그 이유는 Standard ECMA-404 The JSON Data Interchange Syntax, 1st Edition의 page ii에 기재되어 있습니다.
JSON은 숫자에 구애받지 않습니다.모든 프로그래밍 언어에는 다양한 용량과 보완의 다양한 숫자 유형이 있을 수 있습니다. 고정 또는 부동, 이진 또는 십진수입니다.그것은 다른 프로그래밍 언어 간의 교환을 어렵게 할 수 있다.대신 JSON은 인간이 사용하는 숫자의 표현, 즉 일련의 숫자만을 제공합니다.모든 프로그래밍 언어는 내부 표현에서 일치하지 않더라도 숫자 시퀀스를 이해하는 방법을 알고 있습니다.그것은 교류를 허용하기에 충분하다.
그 이유는 많은 사람들이 주장했듯이, ...의 표현에 기인하지 않는다.NaN
★★★★★★★★★★★★★★★★★」Infinity
ECMA 핵심 입니다.JSON을 사용하다
매우 간단하기 때문에 JSON 문법은 절대 바뀌지 않을 것으로 예상됩니다.이것은 기본 표기법으로서 JSON에 엄청난 안정성을 준다.
JSON5는 JSON(추적 콤마 등)에서 누락된 양의 무한 및 음의 무한, NaN 및 유효한 ECMAScript에 대한 표준 Javascript 표기법을 지원합니다.
이것에 의해, JSON은 훨씬 더 편리한 포맷이 됩니다.
단, 보안상의 이유로 JSON을 사용하든 JSON5를 사용하든 항상 해석하십시오.평가하지 마십시오!!
{"key"와 같은 경우의 잠재적인 회피책:무한대:
JSON.parse(theString.replace(/":(Infinity|-IsNaN)/g, '":"{{$1}}"'), function(k, v) {
if (v === '{{Infinity}}') return Infinity;
else if (v === '{{-Infinity}}') return -Infinity;
else if (v === '{{NaN}}') return NaN;
return v;
});
일반적으로 잘못된 값의 발생을 구문 분석 시 인식할 수 있는 문자열로 대체하고 적절한 JavaScript 표현으로 다시 대체합니다.
현재의 IEEE 규격 754-2008에는 10진수 64비트 부동소수점 유형과 2진수 64비트 부동소수점 유형의 두 가지 다른 64비트 부동소수점 표현에 대한 정의가 포함되어 있습니다.
문자열 반올림 후.99999990000000006
와 같다.9999999
IEEE 바이너리 64비트 표현에서는 동일하지 않습니다..9999999
IEEE 10진수 64비트 표현으로 지정합니다.64비트 IEEE 10진 부동 소수점 단위.99999990000000006
가치를 반올림하다.9999999000000001
소수점과는 다릅니다..9999999
가치.
JSON은 숫자 값을 10진수의 숫자 문자열로만 취급하기 때문에 IEEE 바이너리 표현과 10진수 부동소수점 표현(IBM Power 등)을 모두 지원하는 시스템에서는 2개의 가능한 IEEE 숫자 부동소수점 값 중 어느 것이 의도되는지를 판단할 수 없습니다.
나처럼 시리얼화 코드를 제어할 수 없는 경우 NaN 값을 null 또는 다른 값으로 대체하여 다음과 같이 처리할 수 있습니다.
$.get("file.json", theCallback)
.fail(function(data) {
theCallback(JSON.parse(data.responseText.replace(/NaN/g,'null')));
} );
기본적으로 .fail은 원래 json 파서가 비활성 토큰을 검출했을 때 호출됩니다.그런 다음 문자열 치환을 사용하여 비활성 토큰을 바꿉니다.내 경우 시리얼라이저가 NaN 값을 반환하는 것은 예외이므로 이 방법이 최선의 방법입니다.결과에 잘못된 토큰이 포함되어 있는 경우 $.get을 사용하지 말고 JSON 결과를 수동으로 가져와 항상 문자열 치환을 실행하는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/1423081/json-left-out-infinity-and-nan-json-status-in-ecmascript
'programing' 카테고리의 다른 글
MySQL에서 저장 프로시저/함수 정의 보기 (0) | 2022.10.08 |
---|---|
SQL에서 결과를 제외한 OR을 사용하여 쿼리 (0) | 2022.10.08 |
jQuery에서 체크박스가 켜져 있는지 여부를 확인하려면 어떻게 해야 합니까? (0) | 2022.10.08 |
JavaScript를 사용하여 스판 요소의 텍스트를 변경하려면 어떻게 해야 합니까? (0) | 2022.10.02 |
뷰에서 기능을 사용하는 방법 (0) | 2022.10.02 |