PHP json_encode 함수에 문제가 있습니다. 숫자를 문자열로 인코딩합니다. 예 :
array('id' => 3)
된다
"{ ["id": "3", ...)
js가이 값을 만나면이를 문자열로 해석하고 숫자 연산이 실패합니다. 누구든지 json_encode
숫자를 문자열로 인코딩 하지 못하게하는 방법을 알고 있습니까? 감사합니다!
PHP json_encode 함수에 문제가 있습니다. 숫자를 문자열로 인코딩합니다. 예 :
array('id' => 3)
된다
"{ ["id": "3", ...)
js가이 값을 만나면이를 문자열로 해석하고 숫자 연산이 실패합니다. 누구든지 json_encode
숫자를 문자열로 인코딩 하지 못하게하는 방법을 알고 있습니까? 감사합니다!
답변:
나는 매우 빠른 테스트를 수행했습니다.
$a = array(
'id' => 152,
'another' => 'test',
'ananother' => 456,
);
$json = json_encode($a);
echo $json;
내가 실수하지 않으면 이것은 당신이 묘사 한 것과 같습니다.
그리고 나는 출력으로 얻고있다 :
{"id":152,"another":"test","ananother":456}
따라서이 경우 정수는 문자열로 변환되지 않았습니다.
여전히, 이것은 우리가 사용하는 PHP 버전에 따라 다를 수 있습니다 : PHP 버전에 따라 몇 가지 json_encode 관련 버그가 수정되었습니다 ...
이 테스트는 PHP 5.2.6에서 이루어졌습니다. PHP 5.2.9와 5.3.0에서도 마찬가지입니다. 테스트 할 다른 5.2.x 버전이 없지만 :-(
어떤 버전의 PHP를 사용하고 있습니까? 아니면 테스트 사례가 게시 한 예보다 더 복잡합니까?
아마 http://bugs.php.net/의 하나의 버그 보고서 와 관련이있을 수 있습니까? 예를 들어, 버그 # 40503 : json_encode 정수 변환이 PHP와 일치하지 않습니까?
아마 버그 # 38680은 BTW, 당신도 관심을 수 있을까?
PHP 5.3.3부터 숫자 자동 변환을위한 플래그 가 있습니다 (options 매개 변수는 PHP 5.3.0에서 추가되었습니다) :
$arr = array( 'row_id' => '1', 'name' => 'George' );
echo json_encode( $arr, JSON_NUMERIC_CHECK ); // {"row_id":1,"name":"George"}
JSON_NUMERIC_CHECK
문자열을 구문 분석하려고 시도하여 숫자인지 아닌지를 자동으로 추측합니다. 당신이 그것에 대해 생각하면 그것은 매우 신뢰할 수 없습니다. 모든 숫자 모양의 속성을 원하는 속성뿐만 아니라 숫자 로 변환 하고 숫자처럼 보이는 경우에만 수행합니다. 안전하지 않으면 최소한 흔들립니다. 생성 된 JSON을 소비하는 코드는 유형 중 하나에 의존 할 수 있습니다. 이러한 기대가 충족되지 않으면 이상한 일이 발생할 수 있습니다. 모범 사례와 안전에 관심이있는 경우 원하는 값을 선택적으로 변환해야합니다.
나도 마찬가지로 DB (PostgreSQL)에서 읽고 있었고 모든 것이 문자열이었습니다. 각 행을 반복하고 최종 결과 배열을 작성하기 위해 행을 수행하므로
$result_arr[] = array($db_row['name'], (int)$db_row['count']);
루프 내에서 정수 값으로 강제합니다. 내가 할 때 json_encode($result_arr)
지금, 그것은 정확하게 숫자로 포맷합니다. 이를 통해 데이터베이스에서 나오는 숫자와없는 숫자를 제어 할 수 있습니다.
편집하다:
이 json_encode()
함수는 또한 JSON_NUMERIC_CHECK
플래그를 두 번째 인수로 사용하여 즉시이를 수행 할 수 있습니다. 이 사용자 예제에 나와있는 문서 (아래에 복사 됨)에주의하여 사용해야합니다. http://uk3.php.net/manual/en/function.json-encode.php#106641
<?php
// International phone number
json_encode(array('phone_number' => '+33123456789'), JSON_NUMERIC_CHECK);
?>
그런 다음이 JSON을 얻습니다.
{"phone_number":33123456789}
json_encode
함수 가 아니라 데이터 유형을 해석하지 않는 DB 어댑터에 문제가있는 것 같습니다. 이것은 가장 정확한 답변이지만 JSON_NUMERIC_CHECK
전화 번호 및 기타 숫자 문자열 값도 변환 하므로주의하십시오. 이로 인해 선행 0 또는 '+'에 문제가 발생할 수 있습니다 ... DB 읽기 기능 에서이 문제를 해결하는 것이 좋습니다.
시험
$arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);
그러나 PHP 5.3.3에서만 작동합니다. 이 PHP json_encode 변경 로그를보십시오 http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog
같은 문제가 발생합니다 (PHP-5.2.11 / Windows). 이 해결 방법을 사용하고 있습니다
$json = preg_replace( "/\"(\d+)\"/", '$1', $json );
따옴표로 묶인 모든 (음이 아닌 정수) 숫자를 숫자 자체로 바꿉니다 ( ' "42"'는 '42'가 됨).
PHP manual의이 주석 도 참조하십시오 .
$json_array = json_encode($some_array, false);
따라서 잘못된 인수는 PHP가 객체 변환을하지 않도록 지시합니다.
json_encode(array(-1=>'que', '0'=>'-1'))
$this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
다음 테스트는 유형을 문자열로 변경하면 json_encode ()가 숫자를 JSON 문자열 (즉, 큰 따옴표로 묶음)로 반환하는지 확인합니다. settype (arr [ "var"], "정수") 또는 settype ($ arr [ "var"], "float")을 사용하여 수정하십시오.
<?php
class testclass {
public $foo = 1;
public $bar = 2;
public $baz = "Hello, world";
}
$testarr = array( 'foo' => 1, 'bar' => 2, 'baz' => 'Hello, world');
$json_obj_txt = json_encode(new testclass());
$json_arr_txt = json_encode($testarr);
echo "<p>Object encoding:</p><pre>" . $json_obj_txt . "</pre>";
echo "<p>Array encoding:</p><pre>" . $json_arr_txt . "</pre>";
// Both above return ints as ints. Type the int to a string, though, and...
settype($testarr["foo"], "string");
$json_arr_cast_txt = json_encode($testarr);
echo "<p>Array encoding w/ cast:</p><pre>" . $json_arr_cast_txt . "</pre>";
?>
완성도를 높이기 위해 (아직 설명을 추가 할 수 없으므로)이 세부 정보를 다른 답변으로 추가하겠습니다.
(편집 : 소스 데이터 (예 : OP의 경우 데이터베이스 결과 세트)가 문제가 될 수 있음을 인식 한 후 읽으십시오 (숫자 열을 문자열로 반환하여), 실제로 json_encode ()는 문제의 원인이 아닙니다)
" mysql_fetch_array " 의 매뉴얼 페이지 :
페치 된 행에 해당하는 문자열 배열을 리턴합니다 .
... 및 " mysql_ fetch_ row ":
페치 된 행에 해당하는 문자열 의 숫자 형 배열을 리턴합니다.
명확하게 말한다; 반환 된 배열의 항목은 문자열입니다.
(나는 phpBB2에서 DB 클래스를 사용하고 있었고 (예, 쓸모가 없습니다!) 해당 클래스의 "sql_fetchrow ()"메소드는 "mysql_fetch_array ()"를 사용합니다)
그것을 깨닫지 못하고 결국이 질문을 찾고 문제를 이해하게되었습니다! :)
파스칼 마틴 (Pascal Martin)은 그의 후속 의견에서 위에서 언급했듯이 소스에서 "잘못된 유형"문제를 처리하는 솔루션을 생각합니다 (예 : " mysql_field_type () "함수를 사용하고 가져 오기 직후 캐스팅을 수행하는 것으로 생각합니다. "object"?))와 같은 다른 페치 메소드가 일반적으로 더 좋습니다.
json_encode는 일부 데이터 구조를 JSON 형식으로 직렬화하여 네트워크를 통해 전송합니다. 따라서 모든 내용은 문자열 유형입니다. $ _POST 또는 $ _GET에서 일부 매개 변수를받을 때와 같습니다.
전송 된 값에 대해 숫자 연산을해야하는 경우, 먼저 intval ( PHP 의 intval () 함수 또는 Javascript의 parseInt ()) 을 사용하여 값을 int로 변환 한 다음 조작을 실행하십시오.
PHP json_encode ()는 문자열을 반환합니다.
js 코드에서 parseFloat () 또는 parseInt ()를 사용할 수 있습니다.
parseFloat('122.5'); // returns 122.5
parseInt('22'); // returns 22
parseInt('22.5'); // returns 22