【问题标题】:Converting array to JSON string when array already contains JSON strings当数组已经包含 JSON 字符串时将数组转换为 JSON 字符串
【发布时间】:2015-08-31 02:11:12
【问题描述】:

我有一个包含 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 字符串?

【问题讨论】:

  • (1) 编写自定义 JSON 生成器。 (2) 或者解码该数组结构中的jsonish字符串,然后重新编码所有内容。
  • 循环遍历数组将每个json字符串分配给一个新数组,用占位符替换,json编码数组,替换原来的json字符串?
  • 这很好,它会在引号前面抛出一个`\`。 JSON 属性可以被引用,也可以不被引用。如果没有不符合正常属性命名标准的空格或字符情况,则不必使用引号。你的问题是你有整个字符串里面有 JSON
  • json_encode() 通常用于编码 PHP 关联数组,而不是 PHP 中已经是字符串的 JavaScript 对象。

标签: php json


【解决方案1】:

使用 json_decode 将“营养素”转换为数组。

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

然后

echo json_encode($array);

【讨论】:

    【解决方案2】:

    当数组已经包含 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
    

    【讨论】:

      【解决方案3】:

      你应该可以先json_decodejson数据,然后再放回原来的数组。之后,您可以再次对整个数组进行编码以获得所需的输出。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多