【问题标题】:Converting PHP Associative array to JSON object - spaces in value results in malformed JSON将 PHP 关联数组转换为 JSON 对象 - 值中的空格会导致格式错误的 JSON
【发布时间】:2015-09-21 13:15:28
【问题描述】:

我在 PHP 中构建了一个数组并将其转换为 JSON,然后我使用 onclick 事件进行处理并通过 AJAX 发送到另一个文件。

问题是 php 数组中的某些值中有空格。这似乎破坏了 JSON 对象,这意味着我的 AJAX 调用失败。

这里有一段代码可以尝试并详细说明:

//PHP Array looks like this:

            Array
            (
                [card_id] => 1
                [img_id] => 11
                [card_name] => Layout1retro_original
                [card_qty] => 1
                [img_thumb] => albums/160915_E165/thumbs/011_cover-lp-cd_originalDPP_Polaroid.jpg
                [img_hires] => 
                [img_full] => albums/160915_E165/images/011_cover-lp-cd_originalDPP_Polaroid.jpg
                [media] => retro
                [finish] => Perl290
                [size] => original
                [backing] => 
                [can_crop] => 
                [needs_to_be_cropped] => 1
                [been_cropped] => 
                [aspect_ratio] => 0
                [offer_CMF] => 
                [retro-name] => A value
            )

问题key => val 对是retro-name。 JSON 在Avalue 之间的空格处中断。

我使用 json_encode 将数组转换为 JSON 对象以通过 Javascript 传递:stripslashes(json_encode($array))

然后我将它作为data attribute 添加到一个html 元素中,这样我就可以通过onclick 事件来获取它。

这里是数据属性中断的地方:[removed excess code for clarity...] "retro-name":"A" value"}

请注意,它在A 之后添加了一个结束"。这会破坏 JSON 对象的其余部分,因此我的 AJAX 调用失败。

我该如何解决这个问题?

【问题讨论】:

  • 你的数据属性是不是用引号引起来的?
  • 您可以尝试使用 rawurlencode 自己编码。
  • @JosiahKeller 是的。当任何值中都没有空格时,这是经过测试的。
  • 我不明白这个问题。
  • @EliasNicolas 我想我已经很清楚地解释了这个问题。 PHP 数组中键/值对中的空格正在破坏 JSON 对象,如下所示:"retro-name":"A" value"

标签: javascript php arrays json ajax


【解决方案1】:

我最好的猜测是因为 JSON 是在双引号括起来的数据属性中呈现的,这在 HTML 中很常见。请尝试使用单引号,而不是双引号。 PHP 输出带有双引号的 JSON。

如果这不起作用,请您更新您的问题,举例说明如何使用 JSON 呈现数据属性。

【讨论】:

  • 试过单引号和双引号,。这不是问题的原因。
  • 这是从 Web 检查器还是从 HTML 视图源复制的?
  • 从 HTML 视图源复制 - 为什么?原始 html 将引号显示为 html 实体 ("),这使得可读性有点困难。
  • 您需要将属性用单引号括起来,例如 data-card='' 才能正常工作。从您的示例中,我可以看出情况并非如此。如果您的数据包含单引号,则需要将其转义为 HTML 实体。
【解决方案2】:

如果我猜测一下,stripslashes()A" value 中的A 之后删除(假定的)转义" 前面的斜线。我几乎可以肯定原始数据中" 前面有一个\,您没有逐字显示。

【讨论】:

  • 请查看更新。我不认为是 stripslashes 导致了这个问题。
【解决方案3】:

另一种方法:

只需将card_id 放在卡片 div 中

<div class="print-wrap has-size" data-card_id="<?=$array['card_id'];?>">

然后将卡片数据传入JS中的一个变量

<script>var card_data['<?=$array["card_id"]?>'] = <?=json_encode($array);?>;</script>

那么你就有了你的数据和 div 的关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2017-03-29
    • 1970-01-01
    • 2018-03-11
    • 2019-07-28
    相关资源
    最近更新 更多