PHP에서 JSON_DECODE 기능은 일반적으로 표준 형식을 준수하고 PHP 데이터 유형으로 변환하는 JSON 문자열을 구문 분석하는 데 사용됩니다. 표준 JSON 문자열은 키 이름이 이중 인용문 ( "" )으로 둘러싸여 있어야하며 문자열 값은 유효한 유니 코드 문자 등이어야합니다. 그러나 실제 개발에서는 비표준 형식으로 JSON 문자열을 만날 수 있으며 이러한 문자열을 효과적으로 구문 분석하는 방법은 도전이됩니다. 이 기사는 JSON_DECODE 기능을 사용하여 JSON 문자열을 비표준 형식으로 처리하고 실용적인 팁을 공유하는 방법을 살펴 봅니다.
표준 JSON 문자열은 키 이름과 문자열 값을 래프하기 위해 이중 인용문 ( "" )이 필요하지만 때로는 키 이름이나 문자열 값이 단일 따옴표 ( '' )를 사용하는 상황에 직면합니다. PHP의 JSON_DECODE는 단일 따옴표를 직접 지원하지 않지만 간단한 교체로 표준 JSON 형식으로 변환 할 수 있습니다.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">"{'name':'John', 'age':30}"</span></span><span>;
</span><span><span class="hljs-variable">$correctedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>([</span><span><span class="hljs-string">"'"</span></span><span>, </span><span><span class="hljs-string">'"'</span></span><span>], [</span><span><span class="hljs-string">'"'</span></span><span>, </span><span><span class="hljs-string">'"'</span></span><span>], </span><span><span class="hljs-variable">$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">$correctedJson</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>
이 예에서는 str_replace 함수를 사용하여 모든 단일 따옴표를 이중 따옴표로 바꾸어 json_decode가 문자열을 부드럽게 구문 분석 할 수 있도록합니다.
때때로 우리는 닫힌 괄호 나 쉼표가 누락 된 것과 같은 불완전한 JSON 줄을 만날 수 있습니다. 이런 종류의 상황으로 인해 json_decode는 null을 반환합니다. 이를 처리하기 위해 먼저 정규 표현식 또는 간단한 문자열 작업을 사용하여 불완전한 부분을 완료 할 수 있습니다.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30'</span></span><span>; </span><span><span class="hljs-comment">// 닫힌 버팀대가 누락되었습니다</span></span><span>
</span><span><span class="hljs-variable">$fixedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rtrim</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-string">','</span></span><span>) . </span><span><span class="hljs-string">'}'</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">$fixedJson</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>
이 접근법을 사용하면 각 JSON 문자열을 수동으로 확인하고 구문 분석 정확도를 보장 할 수 있습니다.
일부 비표준 JSON 줄에서는 어레이 또는 객체에 요소 후에 추가 쉼표 ( , )가있을 수 있습니다. 이 상황은 표준 JSON에서 불법이지만 간단한 문자열 교체를 통해 초과 쉼표를 삭제하여 JSON_DECODE를 올바르게 구문 분석 할 수 있는지 확인할 수 있습니다.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30,}'</span></span><span>; </span><span><span class="hljs-comment">// 추가 쉼표</span></span><span>
</span><span><span class="hljs-variable">$fixedJson</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/,\s*([}\]])/'</span></span><span>, </span><span><span class="hljs-string">'$1'</span></span><span>, </span><span><span class="hljs-variable">$json</span></span><span>); </span><span><span class="hljs-comment">// 꼬리에서 과도한 쉼표를 제거하십시오</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">$fixedJson</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>
여기서는 preg_replace 함수가 JSON 형식을 준수하도록 끝에서 중복 쉼표를 찾고 삭제하는 데 사용됩니다.
JSON 문자열에 중국어 또는 비 ASCII 문자와 같은 특수 문자가 포함 된 경우, 문자 인코딩 문제로 인해 JSON_DECODE 기능이 구문 분석하지 못할 수 있습니다. JSON 문자열이 UTF-8 인코딩이고 구문 분석 할 때 올바른 문자 세트가 사용되도록함으로써 이러한 유형의 문제를 피할 수 있습니다.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"중국인", "age":30}'</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_UNESCAPED_UNICODE);
</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>
이 예에서 JSON_UNESCAPED_UNICODE 옵션을 사용하면 JSON_DECODE 구문 분석 중에 유니 코드 문자를 탈출하지 못하고 원래 문자를 인코딩합니다.
때때로 우리는 중복 키나 원치 않는 필드를 포함 할 수있는 예상 구조를 준수하지 않는 JSON 문자열을 만듭니다. 두 번째 매개 변수를 전달함으로써 JSON 문자열을 연관 배열로 구문 분석 할 수있어 원치 않는 필드를 건너 뛰고 유용한 데이터를 보존 할 수 있습니다.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30, "extraField":"value"}'</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-comment">// 연관 배열로 해결하십시오</span></span><span>
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'extraField'</span></span><span>]); </span><span><span class="hljs-comment">// 원치 않는 필드를 삭제하십시오</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>
이 코드는 JSON 문자열의 특정 필드를 무시하고 필요한 데이터 만 유지하는 방법을 보여줍니다.
구문 분석 중에 오류가 발생하면 JSON_DECODE는 NULL을 반환합니다. 코드의 견고성을 향상 시키려면 일반적으로 구문 분석 전후에 오류가 발생했는지 확인해야합니다. PHP는 JSON_LAST_ERROR () 및 JSON_LAST_ERROR_MSG () 함수를 제공하여 JSON 파싱에 대한 오류 정보를 얻습니다.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"name":"John", "age":30}'</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">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">json_last_error</span></span><span>() !== JSON_ERROR_NONE) {
</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-keyword">else</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>
이런 식으로, 우리는 JSON 구문 분석의 오류를 정확하게 캡처하고 그에 따라 처리 할 수 있습니다.
비표준 형식으로 JSON 문자열을 다룰 때 JSON_DECODE 기능 자체는 강력한 유연성을 제공하며 대부분의 문제는 일부 문자열 처리 기술을 통해 해결할 수 있습니다. 핵심은 문제를 정확하게 식별하고 적절한 취급 방법을 채택하는 것입니다. 이 기사에서 공유 된 몇 가지 팁을 통해 JSON 데이터를보다 효율적으로 처리하고 코드의 견고성과 안정성을 향상시킬 수 있습니다.