使用以下格式从 PHP 中的 JSON 数组获取值?

Posted

技术标签:

【中文标题】使用以下格式从 PHP 中的 JSON 数组获取值?【英文标题】:Get values from JSON array in PHP with the following format? 【发布时间】:2020-01-25 19:56:51 【问题描述】:

我从与之合作的 android 开发人员那里得到了这个数组,我必须从以下数组中获取键 name 的值:

[ 
    
      "data":"[\"name\":\"step 1 kdfhghdkgjdf\\nkjdhfgkjhdkjghd\\nkdfjhgkjdhfg\\n\\n\\ndfjhgkjdfjhgdfgd\\n\",\"name\":\"step 2 dhfgkjdfhkhkjchjkfd\\ndkjhjdf\\njhkdfhkghdkfhgkdhg\\n\\n\\ndfjhgkjdfhgdfhgkjdhfgkjhdf\",\"name\":\"step 3 kkkkkkkkkk\",\"name\":\"step 4 ljlejrhlflhgf\\n\\n\\ndfhjk\"]",
      "status":1
   
]

我已尝试执行以下操作:

 <?php
    $s = '[
  
    "data": "[\"name\":\"step 1 kdfhghdkgjdf\\nkjdhfgkjhdkjghd\\nkdfjhgkjdhfg\\n\\n\\ndfjhgkjdfjhgdfgd\\n\",\"name\":\"step 2 dhfgkjdfhkhkjchjkfd\\ndkjhjdf\\njhkdfhkghdkfhgkdhg\\n\\n\\ndfjhgkjdfhgdfhgkjdhfgkjhdf\",\"name\":\"step 3 kkkkkkkkkk\",\"name\":\"step 4 ljlejrhlflhgf\\n\\n\\ndfhjk\"]",
    "status": 1
  
]';
    $obj = json_decode($s,true);
    echo $obj[0]['data']
    ?> 

这给了我以下输出:

[
  
    "name": "step 1 kdfhghdkgjdf kjdhfgkjhdkjghd kdfjhgkjdhfg dfjhgkjdfjhgdfgd "
  ,
  
    "name": "step 2 dhfgkjdfhkhkjchjkfd dkjhjdf jhkdfhkghdkfhgkdhg dfjhgkjdfhgdfhgkjdhfgkjhdf"
  ,
  
    "name": "step 3 kkkkkkkkkk"
  ,
  
    "name": "step 4 ljlejrhlflhgf dfhjk"
  
]

但我只想要键 name 的值,例如:

step 1 kdfhghdkgjdf kjdhfgkjhdkjghd kdfjhgkjdhfg dfjhgkjdfjhgdfgd
step 2 dhfgkjdfhkhkjchjkfd dkjhjdf jhkdfhkghdkfhgkdhg dfjhgkjdfhgdfhgkjdhfgkjhdf
step 3 kkkkkkkkkk
.
.
.

我的问题与此类似: Get value from JSON array in PHP 除了格式不同。

我可以获取这种格式的值吗?如果是这样,怎么做?如果不是,是格式不正确吗?

【问题讨论】:

告诉 Android 开发者再次正确地提供 json 数据。这当然是有效的 JSON,但它看起来像 JSON 中的 JSON。我这么说是因为他/她在服务器端让事情变得不必要地复杂。 你是什么意思“你想要键 name 的值”?每个索引都是这些字符串之一的数组就足够了吗? 这里问题的很大一部分是(部分)数据是双重编码的。这需要通过发送数据的应用程序来解决。处理这类问题不是服务器的工作。让他们发送一个连贯的 JSON 对象,而不是这种愚蠢的 JSON-within-JSON 格式 @Shubham 更新部分中的数据与顶部完全相同。有什么区别? 即使在编辑之后,基本点仍然存在。数据仍然是 JSON-within-JSON 并且仍然需要从源头进行更正以使其全部成为一个对象,因此处理起来简单且可预测。与您的 Android 开发人员交谈并说明情况。 【参考方案1】:

假设 $obj[0]['data'] 实际上有您发布的 JSON,只需解码并提取 name 列:

foreach(array_column(json_decode($obj[0]['data'], true), 'name') as $name) 
    echo $name;

【讨论】:

是的......虽然恕我直言,最好将数据作为单个对象发送开始【参考方案2】:

首先,"data" 字段中没有 json 结构,而只是一个包含 json 数据的字符串。

因此,当您将数据转换为常量值时,您做错了。您必须先将所有反斜杠加倍。

然后你可以得到"data"元素并再次执行json_decode

<?php
    $s = '[
  
    "data": "[\\"name\\":\\"step 1 kdfhghdkgjdf\\\\nkjdhfgkjhdkjghd\\\\nkdfjhgkjdhfg\\\\n\\\\n\\\\ndfjhgkjdfjhgdfgd\\\\n\\",\\"name\\":\\"step 2 dhfgkjdfhkhkjchjkfd\\\\ndkjhjdf\\\\njhkdfhkghdkfhgkdhg\\\\n\\\\n\\\\ndfjhgkjdfhgdfhgkjdhfgkjhdf\\",\\"name\\":\\"step 3 kkkkkkkkkk\\",\\"name\\":\\"step 4 ljlejrhlflhgf\\\\n\\\\n\\\\ndfhjk\\"]",
    "status": 1
  
]';
    $obj = json_decode($s,true);
    $data = json_decode($obj[0]['data'], true);

    foreach($data as $item) 
      print($item['name'] . "\r\n");
    

【讨论】:

我发布了格式化的 JSON,请再次检查问题。我已经编辑了问题。 @Shubham,这不会改变我的答案。当你在 php 中将斜杠放入字符串常量时,你必须通过添加斜杠来转义它们。 答案中的代码没有给出任何输出! 它确实输出每个“名称”项。刚刚又检查了一遍。不要忘记&lt;?php 前缀 @MaroofMandal 是的,确实如此。演示:sandbox.onlinephpfunctions.com/code/…。但是,如果数据在发送时采用合理的格式,那就更好了

以上是关于使用以下格式从 PHP 中的 JSON 数组获取值?的主要内容,如果未能解决你的问题,请参考以下文章

从flutter中的多个嵌套json数组中获取值

如何从 php 脚本中获取 JSON 格式的 mysql 表的所有值?

从 Bigquery 中的 json 获取数组

无法从打字稿中的 json 对象获取数组响应

如何从android中的URL获取json数组而不是html

获取 JSON 值到数组