我正在尝试遍历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");
}
}
答案 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所说,您应该利用现有的解决方案。