특정 실행 시간 깊이에 대한 json_decode

아카 나킨

다음 요구 사항이 있습니다.

다음 데이터 샘플이 있습니다.

{
    "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()의 깊이를 보았다 . 깊이 실행을 변경하는 것이 아닙니다.

어떻게 해결할 수 있습니까?

참고 : 효율적인 솔루션이 필요합니다. 내 프로젝트에는 고성능이 필요합니다.

LSerni

를 사용하지 않으려면 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이상한 행동 json_decode

분류에서Dev

앱이 실행 중이거나 닫혀있는 특정 시간에 대한 대화 표시

분류에서Dev

조각의 실제 깊이 대신 특정 깊이 값에 대한 강제 깊이 테스트

분류에서Dev

이 특정 For 루프의 실행 시간

분류에서Dev

특정 실행 경로에 대한 bash 해시 삭제

분류에서Dev

특정 시간에 AWS Lambda 실행

분류에서Dev

특정 시간에 applescript 실행

분류에서Dev

ODOO : 특정 시간에 cron 실행

분류에서Dev

특정 시간에 함수 실행

분류에서Dev

Treadpool : 풀 크기를 결정하기위한 대기 시간 및 실행 시간에 대한 간단한 예

분류에서Dev

명령에 대한 최소 실행 시간 설정

분류에서Dev

블록 수에 대한 cuda 실행 시간 측정

분류에서Dev

여러 스레드에 대한 실행 시간 측정

분류에서Dev

특정 사용자에 대한 Firebase에서 실시간 데이터 검색

분류에서Dev

azure 함수를 특정 시간에 한 번만 실행합니까?

분류에서Dev

매일 아침 특정 시간에 신속한 백그라운드 실행

분류에서Dev

실시간 행동에 대한 설명

분류에서Dev

특정 시간에 대한 document.write

분류에서Dev

Gitlab CI-특정 분기에 대한 병합 요청시 작업 실행

분류에서Dev

식이 일정한 시간에 실행되는지 GCC 확인

분류에서Dev

간단한 JSON, 특정 캡처 그룹에 대한 정규식?

분류에서Dev

PostgreSQL : 특정 시간대에서 특정 요일에 발생하는 행 선택

분류에서Dev

특정 경로에 대한 실시간 교통 정보를지도에 표시하는 방법

분류에서Dev

Django를 사용하여 특별한 시간에 함수 실행

분류에서Dev

특정 시간대의 특정 시간에 대한 epoch 시간을 어떻게 얻을 수 있습니까?

분류에서Dev

VB.NET에서 특정 시간에 함수 실행

분류에서Dev

특정 시간 간격에 대한 쿼리 결과

분류에서Dev

json_decode 후 여러 선택된 값에 대한 print_r

분류에서Dev

SQL 저장 프로 시저의 특정 시간대에 대한 UTC 시간

Related 관련 기사

  1. 1

    이상한 행동 json_decode

  2. 2

    앱이 실행 중이거나 닫혀있는 특정 시간에 대한 대화 표시

  3. 3

    조각의 실제 깊이 대신 특정 깊이 값에 대한 강제 깊이 테스트

  4. 4

    이 특정 For 루프의 실행 시간

  5. 5

    특정 실행 경로에 대한 bash 해시 삭제

  6. 6

    특정 시간에 AWS Lambda 실행

  7. 7

    특정 시간에 applescript 실행

  8. 8

    ODOO : 특정 시간에 cron 실행

  9. 9

    특정 시간에 함수 실행

  10. 10

    Treadpool : 풀 크기를 결정하기위한 대기 시간 및 실행 시간에 대한 간단한 예

  11. 11

    명령에 대한 최소 실행 시간 설정

  12. 12

    블록 수에 대한 cuda 실행 시간 측정

  13. 13

    여러 스레드에 대한 실행 시간 측정

  14. 14

    특정 사용자에 대한 Firebase에서 실시간 데이터 검색

  15. 15

    azure 함수를 특정 시간에 한 번만 실행합니까?

  16. 16

    매일 아침 특정 시간에 신속한 백그라운드 실행

  17. 17

    실시간 행동에 대한 설명

  18. 18

    특정 시간에 대한 document.write

  19. 19

    Gitlab CI-특정 분기에 대한 병합 요청시 작업 실행

  20. 20

    식이 일정한 시간에 실행되는지 GCC 확인

  21. 21

    간단한 JSON, 특정 캡처 그룹에 대한 정규식?

  22. 22

    PostgreSQL : 특정 시간대에서 특정 요일에 발생하는 행 선택

  23. 23

    특정 경로에 대한 실시간 교통 정보를지도에 표시하는 방법

  24. 24

    Django를 사용하여 특별한 시간에 함수 실행

  25. 25

    특정 시간대의 특정 시간에 대한 epoch 시간을 어떻게 얻을 수 있습니까?

  26. 26

    VB.NET에서 특정 시간에 함수 실행

  27. 27

    특정 시간 간격에 대한 쿼리 결과

  28. 28

    json_decode 후 여러 선택된 값에 대한 print_r

  29. 29

    SQL 저장 프로 시저의 특정 시간대에 대한 UTC 시간

뜨겁다태그

보관