[php] PHP 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"}


답변

나도 마찬가지로 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}


답변

시험
$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_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”?))와 같은 다른 페치 메소드가 일반적으로 더 좋습니다.