代码之家  ›  专栏  ›  技术社区  ›  Pranav Mandlik

如何解析响应中的json

  •  -2
  • Pranav Mandlik  · 技术社区  · 6 年前

    我知道这是无效的json,但是我从creditswitchapi得到了这个json的响应我不能更改这个响应,但是我想解析这个json
    当我把它换成钥匙的时候

    desired json response
    {
        "statusCode": "00",
        "statusDescription": {
            "customerNo": 283375350,
            "accountStatus": "OPEN",
            "firstname": "ADVENTURE",
            "lastname": "MOBILE",
            "customerType": "SUD",
            "invoicePeriod": 1,
            "dueDate": "2018-09-29T00:00:00+01:00"
        }
    }
    

    我得到了有效的json,但是如何删除json的第一部分我不知道有什么解决方案,下面是我得到的原始json。

    this is the original json response
    {
        "details": {
            "number": "10553886499",
            "requestType": "VALIDATE_DEVICE_NUMBER"
        },
        "serviceId": "AQA"
    } 
    {
        "statusCode": "00",
        "statusDescription": {
            "customerNo": 283375350,
            "accountStatus": "OPEN",
            "firstname": "ADVENTURE",
            "lastname": "MOBILE",
            "customerType": "SUD",
            "invoicePeriod": 1,
            "dueDate": "2018-09-29T00:00:00+01:00"
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   whitelined    6 年前

    所以,很明显这个API一次输出两个json对象,这不是标准的,并且混淆了php-json解码器。我想你可以做些聪明的事 preg_match 分裂,尽管子序列很复杂。我创建了一个小程序,它似乎可以将这些代码分解成可解码的部分

    $input=<<<DAT
    {
        "details": {
            "number": "10553886499",
            "requestType": "VALIDATE_DEVICE_NUMBER"
        },
        "serviceId": "AQA"
    } 
    {
        "statusCode": "00",
        "statusDescription": {
            "customerNo": 283375350,
            "accountStatus": "OPEN",
            "firstname": "ADVENTURE",
            "lastname": "MOBILE",
            "customerType": "SUD",
            "invoicePeriod": 1,
            "dueDate": "2018-09-29T00:00:00+01:00"
        }
    }
    DAT;
    
    $cur_json='';
    $requests=[];
    $inbrace=false;
    $inquotes=false;
    $inescape=false;
    $bracecnt=0;
    for($i=0;$i<mb_strlen($input);$i++){
        $c=mb_substr($input,$i,1);
        switch($c){
            case '{':
                if(!$inbrace)
                    $inbrace=true;
                $bracecnt++;
                $cur_json.=$c;
                break;
            case '}':
                if($inquotes)
                    $cur_json.=$c;
                else{
                    $bracecnt--;
                    $cur_json.=$c;
                    if($bracecnt==0)
                    {
                        $inbrace=false;
                        $requests[]=$cur_json;
                        $cur_json='';
                    }
                }
                break;
            case '"':
                $cur_json.=$c;
                if(!$inescape&&$inquotes)
                    $inquotes=false;
                else
                    $inquotes=true;
                break;
            case '\\':
                $cur_json.=$c;
                if(!$inescape)
                    $inescape=true;
                else
                    $inescape=false;
                break;
            default:
                $cur_json.=$c;
                break;
        }
    }
    $requests[]=$cur_json;
    
    echo '<pre>';
    var_dump(json_decode($requests[0]));
    var_dump(json_decode($requests[1]));