【问题标题】:How to strip out \\" and \\"" from json_encode() in PHP如何在 PHP 中从 json_encode() 中去掉 \\" 和 \\""
【发布时间】:2021-11-12 00:20:13
【问题描述】:

我有一个简单的问题:

我的 JSON 包含以下内容,我将从 4500 行精简到几行以表明观点:

{ "status": 200, "statusText": "Success", "result": [ { "id": 44281, "title": "100% Sankey by Richard Kaufman - Book", "qty": 11, "price": "42.0000" }, { "id": 47809, "title": "10 Exact Cuts (BLUE) Henry Evans", "qty": 4, "price": "45.0000" }, { "id": 37650, "title": "10 Exact Cuts (RED) Henry Evans", "qty": 12, "price": "45.0000" }, 

...

到问题开始的地方

      {
         "id":50104,
         "title":"System 6 - 6 by Six by Michael \\""Six\\"" Muldoon",
         "qty":5,
         "price":"30.0000"
      },
      {
         "id":67993,
         "title":"Acro Index Dry Erase 3\\"X5\\" (Online Instructions) by Blake Vogt - Trick",
         "qty":17,
         "price":"49.9500"
      },
      {
         "id":70741,
         "title":"Acro Index Dry Erase Large 5\\"x8\\"(Online Instructions) by Blake Vogt - Trick",
         "qty":113,
         "price":"99.9500"
      },
   ]
}

好的,您可以看到我遇到的唯一问题是从我正在使用的 JSON 中删除 \\" 和 \\"":

    if (!empty($result->items->InventoryItem)) {
        // echo "Items added between " . str_replace('T', ' ', $starttime) . " and " . str_replace('T', ' ', $endtime) . "<p></p><ul>";
        foreach ($result->items->InventoryItem as $item) {
            // echo "<li><a href='https://www.somedomain.com/product.aspx?id=" . $item->InternalId . "' target='_blank'>$item->Title</a></li>";
            
            $id = $item->InternalId;
            $title = $item->Title;
            $qty = $item->QuantityAvailable;
            $price = $item->SuggestedRetailPrice;

            // get rid of \\" and then \\""

            $title = str_replace('5\\"x8\\"', '5x8', $title);
            $title = str_replace('\\\\""Six\\\\""', 'Six', $title);
            $title = str_replace('3\\\\"X5\\\\"', '3x5', $title);
            
            stripslashes($title);
            
            $return_arr[] = array(
                "id" => $id,
                "title" => $title,
                "qty" => $qty,
                "price" => $price
            );

        }

        $return_obj = array (
            "status" => 200,
            "statusText" => "Success",
            "result" => $return_arr
        );

        // echo "</ul>";
        echo var_export(json_encode($return_obj, JSON_PRETTY_PRINT));

    } else {
        echo "No items found";
    }

上面的 JSON 是我返回并在线放入 JSONFormatter 的内容。

我真的想用 'Six' 替换 \\""Six\\"",用 3"x5" 或只是 3x5 替换 3\\"X5\\",用 5x8 替换 5\\"x8\\"或 5"x8" 因为我不需要转义字符。我知道我可以在 JavaScript 中做到这一点,但为什么,当 PHP 是我的重担时。

更新和解决方案 在下面每个人的帮助下,这就是完美的工作。谢谢。

    if (!empty($result->items->InventoryItem)) {
        // echo "Items added between " . str_replace('T', ' ', $starttime) . " and " . str_replace('T', ' ', $endtime) . "<p></p><ul>";
        foreach ($result->items->InventoryItem as $item) {
            // echo "<li><a href='https://www.murphysmagic.com/product.aspx?id=" . $item->InternalId . "' target='_blank'>$item->Title</a></li>";
            
            $id = $item->InternalId;
            $title = $item->Title;
            $qty = $item->QuantityAvailable;
            $price = $item->SuggestedRetailPrice;

            // get rid of \\" and then \\""

            $title = str_replace('5\\"x8\\"', '5x8', $title);
            $title = str_replace('\\\\""Six\\\\""', 'Six', $title);
            $title = str_replace('3\\\\"X5\\\\"', '3x5', $title);
            
            stripslashes($title);
            
            $return_arr[] = array(
                "id" => $id,
                "title" => $title,
                "qty" => $qty,
                "price" => $price
            );

        }
        **// UPDATED to reflect what's below.**
        $return_arr[] = array(
            "status" => 200,
            "statusText" => "Success",
            [
                "result" => $return_arr
            ]
        );

        // echo "</ul>";
        echo json_encode($return_arr, JSON_PRETTY_PRINT);

    } else {
        echo "No items found";
    }

第二次更新:很快!

所以,我的 JSON 又回来了,但是如您所见,我希望在结果 [0-99] 之前位于顶部的 STATUS 和 STATUSTEXT 不像您在此处看到的那样。

为了清楚起见,这里是 PHP 中更新的 ARRAY:

        **// UPDATED to reflect what's below.**
        $return_arr[] = array(
            "status" => 200,
            "statusText" => "Success",
            [
                "result" => $return_arr
            ]
        );

最后的解决方案更新

我明白了!

        $obj = (object) [
            "status" => 200,
            "statusText" => "Success",
            "result" => $return_arr
        ];

       echo json_encode($obj, JSON_PRETTY_PRINT);

【问题讨论】:

  • JSON 是一个字符串,这就是它用引号显示的原因。当你解析它时(JavaScript 中的JSON.parse(),PHP 中的json_decode()),它会被转换为对象或数组,并且转义的字符会被正确解析。你不需要对斜杠做任何事情,这一切都由 JSON 解析器处理。
  • 我相信您的问题是额外的不需要的编码层。 echo json_encode(...) 应该是你所做的一切; var_export 弄乱了您的有效 JSON。
  • json_encode 是对象/数组 => 字符串。 json_decode 是字符串 => 对象/数组。
  • 您遇到的问题是var_export() 向您展示了如何将 JSON 编写为 PHP 字符串文字。这需要额外的转义级别来获取 JSON 中使用的所有内部引号和反斜杠。所以你要编码两次:一次用于 JSON,一次用于 PHP。
  • 如果您希望 JSON 来自 PHP,只需执行 echo json_encode($return_obj);

标签: javascript php jquery


【解决方案1】:

解决办法如下:

    if (!empty($result->items->InventoryItem)) {
        // echo "Items added between " . str_replace('T', ' ', $starttime) . " and " . str_replace('T', ' ', $endtime) . "<p></p><ul>";
        foreach ($result->items->InventoryItem as $item) {
            // echo "<li><a href='https://www.somedomain.com/product.aspx?id=" . $item->InternalId . "' target='_blank'>$item->Title</a></li>";

            $id = $item->InternalId;
            $title = $item->Title;
            $qty = $item->QuantityAvailable;
            $price = $item->SuggestedRetailPrice;

            // get rid of \\" and then \\""

            $title = str_replace('5\\"x8\\"', '5x8', $title);
            $title = str_replace('\\\\""Six\\\\""', 'Six', $title);
            $title = str_replace('3\\\\"X5\\\\"', '3x5', $title);

            stripslashes($title);

            $return_arr[] = array(
                "id" => $id,
                "title" => $title,
                "qty" => $qty,
                "price" => $price
            );
        }
        **// THIS DID IT!**
        $obj = (object) [
            "status" => 200,
            "statusText" => "Success",
            "result" => $return_arr
        ];

        echo json_encode($obj, JSON_PRETTY_PRINT);
    } else {
        echo "No items found";
    }

这是结果的样子

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多