确定JSON中给出的属性是否为数组

时间:2018-11-26 14:25:08

标签: php json

我正在尝试遍历JSON中的参数,我想确定我得到的所有类型。

在这里,我从输入中获取JSON并确定它是有效的JSON,并调用递归数组以遍历每个属性。

    $textAreaValue = $_POST['textAreaInput'];
    $textAreaValue = preg_replace('/\s+/S', "", $textAreaValue);
    $decodedJson = json_decode($textAreaValue,true);
    switch (json_last_error()) {
        case JSON_ERROR_NONE:
            $success = array_walk_recursive($decodedJson, "jsonValidator");
        break;
        case JSON_ERROR_DEPTH:
            echo ' - Maximum stack depth exceeded';
        break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - Underflow or the modes mismatch';
        break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Unexpected control character found';
        break;
        case JSON_ERROR_SYNTAX:
            echo json_encode(' - Syntax error, malformed JSON');
        break;
        case JSON_ERROR_UTF8:
            echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
        default:
            echo ' - Unknown error';
        break;
    }

此功能用于验证具有各自类型的属性:

function jsonValidator($value,$key){
    if ($key == "username"){
        if (gettype($value) != string){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: String");
        }
    }
    else if ($key == "isRealUser"){
        if (gettype($value) != boolean){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: Boolean");
        }
    }
    else if ($key == "availablePlatforms"){
        echo json_encode(is_null($value));
    }
    else if ($key == "mobile"){
        echo json_encode(is_null($value));
    }
    else if ($key == "desktop"){
        echo json_encode(is_null($value));
    }
    else if ($key == "availableBalances"){
        if (gettype($value) != object){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: Object");
        }
    }
    else if ($key == "currency"){
        if (gettype($value) != string){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: String");
        }
    }
    else if ($key == "amount"){
        if (gettype($value) != integer){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: Integer");
        }
    }
    else {
        echo json_encode("ERR001 - Unknown attribute");
    }
}

我可以清楚地标识对象,但不能标识数组,ajax响应将为空。这里可能出什么问题了?

Demo ajax:

{
"demoArray":[]
}

在其中放置值只会递归地返回值,但是我想确定它是一个数组。

编辑:

我用PHPTester进行了测试,每当我给availablePlatforms而不是数组一个值作为其他值时,我都会得到回应here。否则,它不会回应任何东西:

$decodedJson = json_decode('{"availablePlatforms": "asd"}',true);
$success = array_walk_recursive($decodedJson, "jsonValidator");
function jsonValidator($value,$key){
    if ($key == "username"){
        if (gettype($value) != string){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: String");
        }
    }
    else if ($key == "isRealUser"){
        if (gettype($value) != boolean){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: Boolean");
        }
    }
    else if ($key == "availablePlatforms"){
        echo "here";
    }
    else if ($key == "mobile"){
        echo json_encode(is_null($value));
    }
    else if ($key == "desktop"){
        echo json_encode(is_null($value));
    }
    else if ($key == "availableBalances"){
        if (gettype($value) != object){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: Object");
        }
    }
    else if ($key == "currency"){
        if (gettype($value) != string){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: String");
        }
    }
    else if ($key == "amount"){
        if (gettype($value) != integer){
            echo json_encode("ERR002 - Not allowed type for attribute: ".$key.", expected: Integer");
        }
    }
    else {
        echo json_encode("ERR001 - Unknown attribute");
    }
}

1 个答案:

答案 0 :(得分:0)

似乎您正在尝试重新实现json_last_error_msg

如果没有in_place_list_bm <- function(n) { res <- tibble(x = rep(NA_real_, n)) tracemem(res) res <- as.list(res) for (i in 1:n) { res[['x']][[i]] <- i } return(res %>% as_tibble()) } > system.time(in_place_list_bm(10000))[[3]] tracemem[0xd87aa08 -> 0xd87aaf8]: as.list.data.frame as.list in_place_list_bm system.time tracemem[0xd87aaf8 -> 0xd87abb8]: in_place_list_bm system.time tracemem[0xd87abb8 -> 0xe045928]: check_tibble list_to_tibble as_tibble.list as_tibble <Anonymous> withVisible freduce _fseq eval eval withVisible %>% in_place_list_bm system.time tracemem[0xe045928 -> 0xe043488]: new_tibble list_to_tibble as_tibble.list as_tibble <Anonymous> withVisible freduce _fseq eval eval withVisible %>% in_place_list_bm system.time tracemem[0xe043488 -> 0xe043728]: set_tibble_class new_tibble list_to_tibble as_tibble.list as_tibble <Anonymous> withVisible freduce _fseq eval eval withVisible %>% in_place_list_bm system.time [1] 0.006 > system.time(in_place_list_bm(100000))[[3]] tracemem[0xdf89f78 -> 0xdf891b8]: as.list.data.frame as.list in_place_list_bm system.time tracemem[0xdf891b8 -> 0xdf89278]: in_place_list_bm system.time tracemem[0xdf89278 -> 0x5e00fb8]: check_tibble list_to_tibble as_tibble.list as_tibble <Anonymous> withVisible freduce _fseq eval eval withVisible %>% in_place_list_bm system.time tracemem[0x5e00fb8 -> 0x5dd46b8]: new_tibble list_to_tibble as_tibble.list as_tibble <Anonymous> withVisible freduce _fseq eval eval withVisible %>% in_place_list_bm system.time tracemem[0x5dd46b8 -> 0x5dcec98]: set_tibble_class new_tibble list_to_tibble as_tibble.list as_tibble <Anonymous> withVisible freduce _fseq eval eval withVisible %>% in_place_list_bm system.time [1] 0.045 的{​​{1}}参数,PHP会将JSON对象解码为$assoc而不是数组的实例。

您要检查两次对象,却忘了加引号。

正如@apokryfos所说,您应该利用现有的解决方案。