【问题标题】:json encode comma failjson编码逗号失败
【发布时间】:2014-02-04 06:16:47
【问题描述】:

我有以下来自 php 文件的 json 响应

{
    "id":"85",
    "title":"Hello,
    hello I said",
    "tags":null,
}

“title”中的正确输出应该是:“title”:“Hello, hello I said”,bla bla bla。

注意Hello后面的逗号。

我正在使用 json_encode() 但我仍然得到上述结果(这会破坏 json)。

这是我的 php 代码:

$query = mysql_query("SELECT * from songs");
$rows = array();
while($r = mysql_fetch_assoc($query)) {
$rows[] = $r;
}

$songArray = array(
  "songs" => $rows
);

$jsonD = json_encode($songArray);

如果我的输入中不包含逗号,一切正常。

代码应该可以工作,没有什么特别之处。

有人知道为什么会这样吗?我该如何解决。 谢谢

【问题讨论】:

  • 您在此处提供的 PHP 代码不应输出该 JSON。实际的 JSON 代码应该类似于 {"songs": [...]},您确定这是您使用的代码吗?
  • 你是对的,它按照你说的方式输出。我写了部分json。
  • 那问题无效?应该删除吗?

标签: php json comma


【解决方案1】:

{ "id":"85", "title":"Hello, hello I said", "tags":null, }

是无效的 json。 null,后面的逗号需要去掉

{ "id":"85", "title":"Hello, hello I said", "tags":null }

【讨论】:

  • 不是他手写的……明明是json_encode的输出。
  • @Okonomiyaki3000 ,这不能是 json_encode 的输出,即使原始数组包含不正确的逗号。 json_encode 旨在输出有效的 json。演示:codepad.org/uVyH9aEh
  • 这很奇怪,但这是 json_encode 输出的一部分。这对我来说也没有意义。
【解决方案2】:

你应该删除"tags":null,之后多余的,——大多数浏览器都会接受这个JSON,但我相信某些IE版本会对此感到厌烦。

您可能遇到的主要问题是您似乎有换行符:

"title":"Hello,
hello I said",

如果这是一个真正的换行符(例如,char 13 或 char 10),那么 javascript 将不高兴(未终止的字符串文字)。解决方法是使用 PHP 字符串替换函数将任何出现的 char 13 或 10 替换为替换字符,可能只是一个空格。这是一个使用 preg_replace() 的示例:

Remove new lines from string

【讨论】:

  • 没有换行符。我在 textarea 中有其他换行符可以正常工作。这是唯一的问题,用逗号。
  • 在执行 json_encode 并在 PHP 中手动删除它之后,您可能需要简单地测试尾随逗号的大小写。不理想。以下是有关尾随逗号的更多信息:stackoverflow.com/questions/201782/…
【解决方案3】:

将 json 传递为

{
"id": "85",
"title": "Hello,hello I said",
"tags": ""
}

我在在线 json 验证器中验证 json 有两个错误,第一个是 json 的第 3 行,它是因为你在“Hello”之后输入了一个输入。第二个是因为您在第四个中输入了 null,您可以使用下面的链接来验证 json。

http://jsonlint.com/

【讨论】:

    【解决方案4】:

    发现了问题。我正在使用一个使 json 易于阅读的函数。事实证明这是函数的问题。每次找到逗号时它都会破坏 json,因此它把一切都搞砸了。我把这个功能拿出来了,每个功能都按预期工作。

    感谢大家的时间和投入。

    【讨论】:

    • 对于使用自定义函数遇到此问题的任何其他人:您需要确保循环具有计数器 + 总计,以及在深度的最后一次迭代中删除逗号的子句。即($total_rows > $iteration) ? ',' : ''
    【解决方案5】:

    使用 rtrim 可以快速解决您的问题,如下所示。

    $json = rtrim(json_encode($songArray), ',}') . '}';
    

    如果您的 Json 在右括号之前有换行符,则使用以下方法可以解决此问题。

    $json = rtrim(json_encode($songArray), ",\n}") . "\n}";
    

    或者您可以使用如下所示的 preg 替换。

    $json = preg_replace("/,}/", '}', json_encode($songArray));
    

    【讨论】:

    • 现在你已经添加了不关闭打开的问题{
    • 我试过这个,各种配置都没有运气..顺便说一句,我正在使用 Ampps 和 php 5.3。我也尝试了其他版本的 php,但没有运气。
    • 在我使用逗号的任何地方,json 都会中断。任何其他想法。
    • 更新了忘记加尾括号了。
    【解决方案6】:

    确实这是无效的json。

    但是,如果你还是想解析那些糟糕的 json,并且你需要多维,你可以使用:

    json_decode(preg_replace('/,\s*}/','}',$config_json));
    

    请注意,它会将任何出现的 ',}' 替换为 },因此请小心 json 中的字符串是否可能包含它们。

    feg.

    {
        "option1": 20,
        "more_info": {
            "the_weird_string": "the string that,  } somehow contains this",
            },
        "option2": 10,
    }
    

    会回来

    [the_weird_string] => the string that} somehow contains this
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2017-05-28
      • 1970-01-01
      • 2021-12-06
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多