在PHP中的JSON中转义要嵌套在JSON中的字符串

问题描述

我的服务器从实际设备接收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递归

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...