【问题标题】:JSON DECODE Array parse sample value issueJSON DECODE Array 解析示例值问题
【发布时间】:2018-09-11 18:03:52
【问题描述】:

我正在尝试将 json 字符串输入为: http://prntscr.com/kt8i8a

{"0":168,"1":168}

{"168":1,"168":2}

{"168":70000,"168":80000}

我的目的是获取 2 个 id=168 的值以保存在数据库中 当我使用json_decode('{"168":1,"168":2}',true) 我得到的结果只有值:

array:1 [
  168 => 2
]

解析完整值有多少种方法?,谢谢

【问题讨论】:

  • 同一键出现两次不是有效的 JSON。
  • PHP 或 JSON 中不能有重复的键。
  • 有道理,不是吗?拥有两个指向两个不同值的相同键违背了键的目的。您应该能够引用该键来查找值。
  • 那是我的项目。我必须添加 2 个 id 相同但选项值不同的产品。
  • 嗯,你的句子“我正在尝试输入 json 字符串”是不正确的。如果这是您获得的数据,并且您无法控制它,那么您将在 not JSON 中给出什么。它只是一个试图看起来像 JSON 的文本字符串。

标签: php arrays json laravel parsing


【解决方案1】:

对象/字典中的键是唯一的,因此最后一个键的值将是最终值并替换之前的所有其他值。

两种解决方案,要么将 2 个对象放入一个数组中:

[
    {
        "168": "1"
    },
    {
        "168": "2"
    }
]

或者有一个键为168 的对象有2个值:

{
    "168": [
        "1",
        "2"
    ]
}

【讨论】:

    【解决方案2】:

    在您的情况下,我希望您可以修改编码 json 的格式,添加一些额外的信息以使其成为多维数组。有不同的方法可以让相同的键索引具有不同的值,其中一种可能是这样的:

    {"data":
      [
        {"168":"1"},{"168":"2"}
      ]
    }
    

    在这种情况下,您可以获得所需的结果并访问值,否则不可能像您的代码那样,因为您有一个重复的唯一键索引。 希望很明确,可以帮助你。

    【讨论】:

    • 谢谢,对我也有帮助
    【解决方案3】:

    这不是有效的 json 语法,请尝试修复它。

    如果你不能因为你没有开发它而无法影响 api,你可以像这样尝试通过正则表达式解析:

    <?php
    //print out the result
    var_dump(getInvalidCustomJson('{"0":168,"1":168}'));
    
    function getInvalidCustomJson($json){
        $res = array(); // result array which get returned
        preg_match_all('/"([0-9]+)".([0-9]+)/m',$json, $result, PREG_PATTERN_ORDER); // matching a key between "..." and a value which get send afterwards
        for($i = 0; $i < count($result[0]); $i++){ // go through all results
            $std = array();
            $std[$result[1][$i]] = $result[2][$i]; // insert key and value from the groups into the array
            $res[] = $std; // add the array to the result array
            // $res[$result[1][$i]] = $result[2][$i]; wont work because it will
            // overwrite the key like json decoder does
        }
        return $res; // return array
    }
    ?>
    

    【讨论】:

    • 如果他不能影响输出,因为它来自 api,这不是他的错。如果可以,他肯定应该选择其他解决方案
    • @BlackNetworkBit 一直在为解决方案添加一点解释,供操作人员理解。最后,SO 也适用于想要学习的人,而不仅仅是要求某人提供解决方案。
    • @Sigma 我给它加了 cmets,如果你有什么要加的就去吧
    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多