当数组已包含JSON字符串时,将数组转换为JSON字符串

时间:2015-08-31 02:11:13

标签: php json

我有一个包含JSON字符串的数组。

Array
(
    [0] => Array
        (
            [name] => Original
            [nutrients] => {"calories":{"value":2500,"operator":2},"protein":{"value":500,"operator":1},"carbs":{"value":200,"operator":0},"fat":{"value":50,"operator":0},"sugar":{"value":1,"operator":2}}
        )

    [1] => Array
        (
            [name] => Rest
            [nutrients] => {"calories":{"value":5000,"operator":2},"sugar":{"value":10,"operator":2}}
        )

)

我想将整个数组转换为JSON字符串

echo json_encode($array);

但是这会在所有引号前面引发\

[{"name":"Original","nutrients":"{\"calories\":{\"value\":2500,\"operator\":2},\"protein\":{\"value\":500,\"operator\":1},\"carbs\":{\"value\":200,\"operator\":0},\"fat\":{\"value\":50,\"operator\":0},\"sugar\":{\"value\":1,\"operator\":2}}"},{"name":"Rest","nutrients":"{\"calories\":{\"value\":5000,\"operator\":2},\"sugar\":{\"value\":10,\"operator\":2}}"}]

出现此问题是因为营养素值已经是JSON字符串。

当数组已经包含JSON字符串时,如何将数组转换为JSON字符串,而在引号前面没有斜杠?

3 个答案:

答案 0 :(得分:1)

使用json_decode转换营养素'数组。

foreach($array as &$a){
 $a['nutrients'] = json_decode($a['nutrients']); 
}

然后

echo json_encode($array);

答案 1 :(得分:1)

  

如果数组已经包含JSON字符串,而在引号前没有斜杠,我怎样才能将数组转换为JSON字符串?

如果要将JSON值保留为字符串;那么,你不能,而你也不应该!

如果您的数组已经包含一些JSON值(其中它们会有一些引号:")并且您想将该数组编码为JSON字符串,则引号必须正确转义,你得到的正确;否则,整个JSON字符串将因为错过引号匹配而损坏。

这是因为"在JSON中有特殊含义,但\"表示"双引号字符" 没有"的特殊标记;例如,从有效的JSON字符串中删除反斜杠会导致一些语法错误:

$json = '[{"name":"Original","nutrients":"{\"calories\":{\"value\":2500,\"operator\":2},\"protein\":{\"value\":500,\"operator\":1},\"carbs\":{\"value\":200,\"operator\":0},\"fat\":{\"value\":50,\"operator\":0},\"sugar\":{\"value\":1,\"operator\":2}}"},{"name":"Rest","nutrients":"{\"calories\":{\"value\":5000,\"operator\":2},\"sugar\":{\"value\":10,\"operator\":2}}"}]';
$json_noBackslashes = str_replace('\\', '', $json);
$json_decoded = json_decode($json_noBackslashes);
echo json_last_error_msg(); // Syntax error

答案 2 :(得分:0)

您应该首先json_decode json数据,然后将其放回原始数组。之后,您可以再次对整个数组进行编码以获得所需的输出。

foreach ($data as $datum) {
   $data['nutrients'] = json_decode($data['nutrients']);
}

json_encode($data);