JSON_DECODE가 매우 큰 정수를 만났을 때 PHP 5.4 이전에이를 플로팅 유형으로 변환하여 데이터 손실로 이어질 수 있습니다. 예를 들어, JSON에 많은 수가있는 경우 :
<span><span><span class="hljs-punctuation">{</span></span><span>
</span><span><span class="hljs-attr">"big_number"</span></span><span><span class="hljs-punctuation">:</span></span><span> </span><span><span class="hljs-number">12345678901234567890</span></span><span>
</span><span><span class="hljs-punctuation">}</span></span><span>
</span></span>
PHP 5.3 이하 에서이 숫자는 json_decode를 호출 할 때 플로팅 유형이 될 수 있으며 정확도가 손실됩니다. PHP 5.4는 JSON_BIGINT_AS_STRING 상수를 소개합니다. 이 상수를 지정하면 JSON_DECODE는 큰 정수를 플로팅 유형으로 변환하는 대신 문자열로 처리합니다. 이것은 정확도 손실의 문제를 피합니다.
예를 들어:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"big_number": 12345678901234567890}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>, </span><span><span class="hljs-number">512</span></span><span>, JSON_BIGINT_AS_STRING);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'big_number'</span></span><span>]; </span><span><span class="hljs-comment">// 산출 "12345678901234567890"</span></span><span>
</span></span>
이 방법은 금융, 과학 컴퓨팅 및 기타 분야를 처리 해야하는 응용 프로그램에 특히 적합하며 숫자 값의 정확도가 영향을받지 않도록 할 수 있습니다.
JSON_PRETTY_PRINT CONSTANT는 PHP 5.3까지 일찍 존재했지만 JSON_DECODE 기능에 대한 동작이 변경되었습니다. PHP 5.4에서 JSON_PRETTY_PRINT는 주로 json_encode 함수의 출력 형식에 영향을 미치며 더 이상 json_decode에 영향을 미치지 않습니다. 그러나 개발자가 디버깅 중에 JSON 데이터의 구조를보다 쉽게 읽고 이해하는 데 도움이 되므로이 상수의 역할을 이해하는 것이 여전히 중요합니다.
예를 들어, json_encode는 json_pretty_print constant와 함께 사용됩니다.
<span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'foo'</span></span><span> => </span><span><span class="hljs-string">'bar'</span></span><span>, </span><span><span class="hljs-string">'baz'</span></span><span> => </span><span><span class="hljs-string">'qux'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">json_encode</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, JSON_PRETTY_PRINT);
</span></span>
출력 결과 :
<span><span><span class="hljs-punctuation">{</span></span><span>
</span><span><span class="hljs-attr">"foo"</span></span><span><span class="hljs-punctuation">:</span></span><span> </span><span><span class="hljs-string">"bar"</span></span><span><span class="hljs-punctuation">,</span></span><span>
</span><span><span class="hljs-attr">"baz"</span></span><span><span class="hljs-punctuation">:</span></span><span> </span><span><span class="hljs-string">"qux"</span></span><span>
</span><span><span class="hljs-punctuation">}</span></span><span>
</span></span>
JSON_DECODE 자체는 JSON 문자열을 형식화하지는 않지만 JSON_ENCODE를 수행 할 때 개발자가 사용하여 출력이 더 친숙하고 읽을 수 있는지 확인할 수 있습니다.
PHP 5.4는 또한 JSON_DECODE 의 재귀 구문 분석 기능을 향상시킵니다. 이제 JSON 문자열에 중첩 된 배열 또는 객체가 포함 된 경우 JSON_DECODE는 이러한 재귀 구조를보다 지능적으로 처리하여보다 복잡한 JSON 데이터를 올바르게 구문 분석 할 수 있도록합니다. 예를 들어:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"person": {"name": "John", "age": 30}, "address": {"city": "New York", "zip": "10001"}}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span></span>
산출:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[person] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[name] => John
[age] => </span><span><span class="hljs-number">30</span></span><span>
)
[address] => </span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[city] => New York
[zip] => </span><span><span class="hljs-number">10001</span></span><span>
)
)
</span></span>
이러한 개선을 통해 개발자는 중첩 구조의 복잡성에 대한 걱정을 피할 수 있으며 JSON 데이터는 다차원 배열 또는 객체로 직접 변환 될 수 있습니다.
PHP 5.4의 JSON_DECODE 함수는 비 ASCII 문자를 포함하는 JSON 스트링을 처리 할 때 UTF-8 인코딩에 대한 지원을 향상시킵니다. JSON_DECODE는 또한 PHP 5.3에서 UTF-8 인코딩을 지원하지만 PHP 5.4는 입력 데이터가 유효한 UTF-8 인코딩인지 확인하기 위해이를 엄격하게 검증했지만 그렇지 않으면 NULL이 반환됩니다.
예를 들어:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name": "José"}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>]; </span><span><span class="hljs-comment">// 산출 "José"</span></span><span>
</span></span>
이러한 개선으로 인해 개발자는 특수 문자가 포함 된 JSON 데이터를 처리 할 때 예기치 않은 구문 분석 오류 또는 인코딩 문제를 경험하지 않도록합니다.
PHP 5.4는 JSON_DECODE 기능의 오류 처리에서 일부 최적화를 만들었습니다. JSON_DECODE 구문 분석이 실패하면 NULL이 반환됩니다. 그러나보다 자세한 오류 정보를 얻으려면 JSON_LAST_ERROR () 함수를 사용할 수 있습니다. PHP 5.4 이전에는 오류 메시지가 비교적 간단했으며 개발자가 오류의 특정 원인을 결정하기가 어려울 수 있습니다. 이제 PHP 5.4는 더 많은 오류 코드를 제공하여 개발자가 문제를보다 정확하게 찾는 데 도움이 될 수 있습니다.
예를 들어:
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name": "John", "age":}'</span></span><span>; </span><span><span class="hljs-comment">// 잘못된 JSON 체재</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-literal">null</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'JSON 디코딩 오류: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">json_last_error_msg</span></span><span>(); </span><span><span class="hljs-comment">// 산출详细的错误信息</span></span><span>
}
</span></span>
이러한 방식으로 개발자는 JSON 데이터의 형식 문제를 쉽게 식별하고 수정할 수 있습니다.