【问题标题】:Remove quotes (single/double) from key/value of a JSON string从 JSON 字符串的键/值中删除引号(单/双)
【发布时间】:2015-07-19 20:37:30
【问题描述】:

示例输入字符串:

{"14" 合金车轮(4 件套)":"N/A","Engine":"CrDi","15" 合金车轮":"optional","Other":"16" Wheels" };

有4种可能的情况:

{“这里的键”:

,"关键"在这里":

:"这里的值",

:“这里的值”}

我需要去掉键和值之间的逗号,这是导致

无效的json

在 PHP 中使用 json_decode 时。

一种可能的解决方案是使用正则表达式,但我无法制定上述可能的情况。

【问题讨论】:

  • 这不是一个有效的 JSON 字符串。嵌入的引号应该用反斜杠转义。如果你正确地创建了 JSON 字符串,json_decode() 应该能够解析它,你不需要做任何额外的事情。
  • 当引号没有正确转义时,字符串是不明确的。没有可靠的方法来判断键是否结束而值是否开始。您不能只查找:,,因为它们可能是键或值的一部分。
  • 你不应该尝试解析这个,你应该首先修复产生错误 JSON 的代码。它可能是手动创建 JSON,而不是使用 PHP 中的 json_encode() 或 Javascript 中的 JSON.stringify() 之类的库函数。除非数据非常简单,否则这将导致灾难。
  • 我从 API 接收到上述字符串,并将其保存在我的数据库中。我只能在我身边解码。我尝试用 : 来分解字符串,对于每个元素,我再次用 " 来分解,如果数组长度是奇数,这意味着一个额外的 ",我正在替换它,但它是一个双循环过程,效率不够。
  • @anurag:请检查这是否适合您:(?<=[{,:])"([^",:{}]*)"([^",:{}]*)" 替换为 "$1$2"。见regex101.com/r/uC5yV2/1ideone.com/AxR2Zb

标签: php regex json


【解决方案1】:

我对您的字符串进行了一些测试,并提出了以下解决方案。

  1. json 格式与其他格式区分开来
  2. 更正键和值
  3. 恢复json格式

    function repairJson( $str) {
        $search = array( '":"', '","', '":{"', '"},"', '{"', '"}' );
        $replace = array("':'", "','", "':{'", "'},'", "{'", "'}" );
        // Distinct json default formatting
        $str = str_replace( $search, $replace, $str );
        // Find and replace all " that are not yet escaped
        $str = preg_replace( '/([^\\\])"/', '${1}\"', $str );
        // Restore json default formatting
        $str = str_replace( $replace, $search, $str );
        return $str;
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多