问题描述
我的服务器从实际设备接收JSON数据,然后将其保存在MysqL JSON字段中。不幸的是,制造商似乎在他们的代码中存在一个错误,该错误导致部分数据被字符串化以转义的JSON。
[
"foo","bar","info",{
"data": "{\"parts\":[{\"id\":1,\"serial\":\"19777\",\"type\":\"NONE\",\"key\":\"\"}]}","vendor": "Test","message": "Hello world"
}
]
即使在json_decode
上运行JSON_UnesCAPED_SLASHES
也会产生一个字符串
Array
(
[0] => foo
[1] => bar
[2] => info
[3] => Array
(
[data] => {"parts":[{"id":1,"serial":"19777","type":"NONE","key":""}]}
[vendor] => Test
[message] => Hello world
)
)
但是预期的输出是
Array
(
[0] => foo
[1] => bar
[2] => info
[3] => Array
(
[data] => Array
(
[parts] => Array
(
[0] => Array
(
[id] => 1
[serial] => 19777
[type] => NONE
[key] =>
)
)
)
[vendor] => Test
[message] => Hellow world
)
)
由于我不能指望他们很快就会发布固件更新,因此我可以在整个JSON上运行任何功能以识别字符串化的JSON并在保存到MysqL之前对请求进行重新编码,但不会影响执行此操作的其他消息没有类似的错误?
解决方法
更新:将$json
中的所有嵌套json数据转换为关联数组:
使用函数$arr
通过数组recurse()
进行递归,以找到具有json数据的所有元素,并json_decode()
来达到您的预期输出:
<?php
$arr = json_decode($json,true);
recurse($arr); // json_decode() any json inside $arr
function recurse(array &$arr)
{
foreach ($arr as $key => &$value) {
if (is_array($value)) {
recurse($value);
} else {
if (is_object(json_decode($value))) {
$value = json_decode($value,true); // turn json into assoc array
}
}
}
}
工作demo
,如果主要关注的是“数据”字段,则应该可以。
$json = '[
"foo","bar","info",{
"data": "{\"parts\":[{\"id\":1,\"serial\":\"19777\",\"type\":\"NONE\",\"key\":\"\"}]}","vendor": "Test","message": "Hello world"
},{
"data": {"parts":[{"id":1,"serial":"19777","type":"NONE","key":""}]},"message": "Hello world"
}
]';
$arr = json_decode($json,true);
$out = array();
foreach($arr as $a)
{
if(is_array($a))
{
if(!is_array($a['data']))
{
$a['data'] = json_decode($a['data'],true);
}
}
$out [] = $a;
}
print_r($out);
,
快速解决方案:
$full_array = array_map('json_decode',$array);
如果并非所有参数都是JSON,并且您想要实际的数组而不是stdClass对象,则可能必须这样做:
function json_decode_array($input) {
$from_json = json_decode($input,true);
return $from_json ? $from_json : $input;
}
$full_array = array_map('json_decode_array',$array);
主要回答:https://stackoverflow.com/a/10458008/3398171
Google:php json_decode递归