다음 요구 사항이 있습니다.
다음 데이터 샘플이 있습니다.
{
"username" : "aras",
"id" : 2,
"report" : {
"reportId" : 5,
"reportFields" : {json array}
}
}
다음과 같이 데이터를 디코딩하고 싶습니다.
[username] => aras
[id] => 2
[report] => array(
reportId => 5,
reportFields => {json array} // which should be string only
나는 json_decode()
의 깊이를 보았다 . 깊이 실행을 변경하는 것이 아닙니다.
어떻게 해결할 수 있습니까?
참고 : 효율적인 솔루션이 필요합니다. 내 프로젝트에는 고성능이 필요합니다.
를 사용하지 않으려면 json_decode
정규 표현식을 사용하여 "디코딩되지 않음"필드를 json_decode
추출한 다음 수정 된 변수를 추출하고 마지막으로 추출 된 항목을 결과 배열에 다시 할당 할 수 있습니다.
정규 표현식 /"reportFields"\s*:\s*(.*)}\s*}\s*$/ms
은 항목과 일치하고 하위 수준 배열 요소를 반환해야합니다. 전체 일치 "reportFields": "" } }
항목을로 바꾸면 디코딩하고 다시 강화할 수있는 JSON 엔터티를 얻을 수 있습니다.
양자 택일로, 당신은 같은 독립적 인 문자열로, 2, 5 "ARAS"를 추출 할 수 있습니다 preg_match
하지 실행 preg_replace
또는 json_decode
전혀.
기술적으로 regexps를 사용하는 것은 잘못된 순서입니다 . JSON 사전은 어떤 순서로든 항목 을 포함 할 수 있지만 내가 제공 한 regexp 는 특정 순서 의 필드 만 인식 하므로 약 12 개의 가능한 주문이 있어야합니다. -주문이 일치하지 않으면 실패합니다.
그러나 일반적으로 JSON 생산자는 항상 동일한 순서로 답변을 제공하는 경향이 있습니다. 그러나 이것이 사실인지 확인하십시오.
<?php
$json = <<<JSON {
"username" : "aras",
"id" : 2,
"report" : {
"reportId" : 5,
"reportFields" : {json array}
} } JSON;
preg_match('#^\\s*{\\s*"username"\\s*:\\s*"(.*?)",\\s*'
.'"id"\\s*:\\s*(\d+),\\s*'
.'"report"\\s*:\\s{\\s*"reportId"\\s*:\\s*(\d+),'
.'\\s*"reportFields"\\s*:\\s*{(.*?)}\\s*}\\s*}\\s*$#sm',
$json,
$gregs);
$ar = array( 'username' => $gregs[1],
'id' => $gregs[2],
'report' => array(
'reportId' => $gregs[3],
'reportFields' => $gregs[4] ));
print_r($ar);
산출:
Array
(
[username] => aras
[id] => 2
[report] => Array
(
[reportId] => 5
[reportFields] => json array
)
)
json_array의 크기와 구조에 따라 "재귀 디코딩 후 다시 코딩 $ar['report']['reportFields']
"솔루션이 더 성능이 좋을 수 있습니다 (유지 관리가 훨씬 더 용이 할뿐만 아니라).
$ar = json_decode($json);
$ar['report']['reportFields'] = json_encode($ar['report']['reportFields']);
경우 json_array
너무 복잡하지 않습니다, 나는 정규 표현식 솔루션을 피할 것.
분명히 regexp 솔루션은 (실제로) JSON 솔루션보다 두 배 이상 빠르지 않습니다.
따라서 정규 표현식을 유지 해야 할 가능성이있는 경우 (예 : JSON 형식이 변경 될 수 있음) 반드시 JSON 버전을 사용합니다.
<?php
$z = array('test');
for ($items = 1; $items < 100; $items++)
{
$z[] = "test-$items";
$j = json_encode($z);
$json = <<<JSON
{
"username" : "aras",
"id" : 2,
"report" : {
"reportId" : 5,
"reportFields" : $j
}
}
JSON;
if ($items % 10)
continue;
$ITER = 100000;
$a = microtime(True);
for ($i = 0; $i < $ITER; $i++) {
preg_match('#^\\s*{\\s*"username"\\s*:\\s*"(.*?)",\\s*'
.'"id"\\s*:\\s*(\d+),\\s*'
.'"report"\\s*:\\s{\\s*"reportId"\\s*:\\s*(\d+),'
.'\\s*"reportFields"\\s*:\\s*([[].*?[]])\\s*}\\s*}\\s*$#sm',
$json,
$gregs);
$ar = array( 'username' => $gregs[1],
'id' => $gregs[2],
'report' => array( 'reportId' => $gregs[3], 'reportFields' => $gregs[4] ));
}
$b = microtime(True);
for ($i = 0; $i < $ITER; $i++) {
$ar = json_decode($json, True);
$ar['report']['reportFields'] = json_encode($ar['report']['reportFields']);
}
$c = microtime(True);
$s1 = number_format(1000000*($b-$a)/$ITER, 2);
$s2 = number_format(1000000*($c-$b)/$ITER, 2);
$r = $s1/$s2;
print "$items items, regexp: $s1 million op/s, JSON: $s2 million op/s, ratio=$r\n";
}
?>
출력 (일부) :
10 items, regexp: 6.65 million op/s, JSON: 8.25 million op/s, ratio=0.806060606060606144
20 items, regexp: 8.47 million op/s, JSON: 12.00 million op/s, ratio=0.705833333333333424
30 items, regexp: 9.93 million op/s, JSON: 15.54 million op/s, ratio=0.638996138996139051
40 items, regexp: 11.85 million op/s, JSON: 19.11 million op/s, ratio=0.620094191522762905
50 items, regexp: 13.46 million op/s, JSON: 22.68 million op/s, ratio=0.593474426807760191
60 items, regexp: 15.18 million op/s, JSON: 26.74 million op/s, ratio=0.567688855646970802
70 items, regexp: 16.85 million op/s, JSON: 30.35 million op/s, ratio=0.555189456342668919
정규 표현식 솔루션은 더 잘 확장되지만 JSON 솔루션보다 거의 두 배 빠른 속도로 만드는 데 꽤 긴 json_array가 필요합니다 . 전형적인 짧은 입력에 대해 JSON 솔루션은 빠른 정규 표현식, 그리고 한 80 % 방법이 간단하고 유지 보수가.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다