无法使用json_decode()解析JSON Web服务响应

时间:2015-08-16 14:06:23

标签: php json

在服务返回错误的情况下,我正在努力解析Web服务响应JSON。

示例JSON - 成功流程:

{
    "Response": [{
        "iconPath" : "/img/theme/destiny/icons/icon_psn.png",
        "membershipType": 2, 
        "membershipId": "4611686018429261138",    
        "displayName": "Spuff_Monkey"
     }],
    "ErrorCode": 1,
    "ThrottleSeconds": 0,
    "ErrorStatus": "Success",
    "Message": "Ok",
    "MessageData":{}
}

示例JSON - 错误流程:

{
    "ErrorCode": 7,
    "ThrottleSeconds": 0,
    "ErrorStatus": "ParameterParseFailure",
    "Message": "Unable to parse your parameters.  Please correct them, and try again.",
    "MessageData": {}
}

现在我的PHP:

function hitWebservice($endpoint) {

    $curl = curl_init($endpoint);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/json"));

    $json_response = curl_exec($curl);

    if(curl_exec($curl) === false) {
        echo "Curl error: " . curl_error($curl);
    }

    curl_close($curl);

    $array_response = json_decode($json_response, true);
    $function_response = array();

    if (!isset($array_response['Response'])) {
        $function_response = $array_response;
    } else {
        $function_response = $array_response['Response'];
    }

    return $function_response;
}

我想要实现的是当JSON包含“响应”块时,我把它放在一个新数组中,只从函数返回那个细节,其中“Response”不存在我想要返回完整JSON作为数组。

但是目前,如果没有“响应”,我会得到一个空数组。

我的逻辑出现了问题,我无法在我的脑海中超越它,所以是时候寻求帮助了!

2 个答案:

答案 0 :(得分:1)

如果您注意到,好的和坏的回复都包含ErrorCode

您可以更好地设计代码以便在此字段中工作,而不是测试可能存在或可能不存在的字段。

所以试试这个: -

$array_response = json_decode($json_response, true);

switch ( $array_response['ErrorCode'] ) {
case 1 :
    do_errorCode_1_processing($array_response)
    break;
 case 2 :
    do_errorCode_2_processing($array_response)
    break;

 // etc etc


}

答案 1 :(得分:-1)

isset()不是用于检查数组中的键是否存在的正确函数。

改为使用array_key_exists()。

http://php.net/manual/en/function.array-key-exists.php

因此您的代码应如下所示:

$array_response = json_decode($json_response, true);

$function_response = array();
if (array_key_exists('Response', $array_response)) {
    $function_response = $array_response['Response'];
} else {
    $function_response = $array_response;
}

return $function_response;

以上应该可以解决问题。