【问题标题】:JSON parsing error in PHPPHP中的JSON解析错误
【发布时间】:2014-07-18 14:13:37
【问题描述】:
$val_array = json_decode($json_data, true);

我解码了一个 JSON 数组并将其存储到一个变量中。 JSON 有来自服务器端的数据。

当我 var dump 这个数组 var_dump($val_array); 我得到:

{
    "groups": {
        "connect": "yes",
        "Name": "admin",
        "id": "1",
        "Groups": "1",
        "manage": "1",
        "Users": "1",
        "show": "1",
        "log": "1"
    }
}

然后我检查数组的大小。

$x=count($val_array); gives 1 as output
$x=count($val_array['groups']); gives 8 as output

当我的数据库中有更多数据时,JSON 看起来像这样

{
    "groups": [{
        "connect": "yes",
        "Name": "admin",
        "id": "1",
        "Groups": "1",
        "manage": "1",
        "Users": "1",
        "show": "1",
        "log": "1"
    },
              {
        "connect": "no",
        "Name": "noadmin",
        "id": "2",
        "Groups": "2",
        "manage": "2",
        "Users": "2",
        "show": "2",
        "log": "2"
              }

] }

我想将值显示到 html 表中。我使用了一个简单的 for 循环。

$val_array = $val_array['groups'];

for($i=0; $i<$x; $i++)
{

$a= $val_array['connect'];
$b= $val_array['Name'];
$c= $val_array['id'];
$d= $val_array['Groups'];
$e= $val_array['manage'];
$f= $val_array['Users'];
$g= $val_array['show'];
$h= $val_array['log'];
}

我应该使用$x 的值是多少?

当我使用$x=count($val_array); 时,如果 JSON 有超过 1 个数据,则会出现错误。未定义的偏移量什么的,如果数据只有1,那么它可以工作。

当我使用这个$x=count($val_array['groups']); 时,如果 JSON 数据有 1 个数据,大小返回为 8。

我用的时候

$x=count($val_array['groups']);

var_dump($val_array);

我的页面中有:Notice: Undefined offset: 0

大小为 8。

array (size=1)
  'groups' => 
    array (size=8)
      'connect' => string '1' (length=1)
      'Name' => string 'admin' (length=10)
      'id' => string '1' (length=1)
      'Groups' => string '1' (length=1)
      'manage' => string '1' (length=1)
      'Users' => string '1' (length=1)
      'show' => string '1' (length=1)
      'log' => string '1' (length=1)

作为 var_dump 输出。

【问题讨论】:

  • 第二种情况下的 JSON 格式错误。分组结束后} 后需要一个逗号
  • 你能告诉我们var_dump($val_array);解码后的第二个json字符串吗?
  • 使用foreach 而不是for
  • var_dump() 从什么时候开始显示这样的关联数组?它总是将数据的类型放在第一位,并以Array(size) 开头,在键和值之间显示=&gt;,而不是:。这看起来更像是原始 JSON,而不是 var_dump 的输出。
  • 即使添加了逗号,它仍然不是有效的 JSON。 { } 包围对象,每个元素都必须采用key: value 的形式。您没有第二个值的键。你确定不是groups: [ { ... }, { ...} ]

标签: php mysql arrays json


【解决方案1】:

如果groups 应该是一组对象数组,那么 JSON 应该是:

{
   "groups":[
      {
         "connect":"yes",
         "Name":"admin",
         "id":"1",
         "Groups":"1",
         "manage":"1",
         "Users":"1",
         "show":"1",
         "log":"1"
      },
      {
         "connect":"no",
         "Name":"noadmin",
         "id":"2",
         "Groups":"2",
         "manage":"2",
         "Users":"2",
         "show":"2",
         "log":"2"
      }
   ]
}

您需要在阵列周围使用[ ]。使用这个 JSON,count($val_array['groups']) 应该返回 2,而不是 8。看到这个demo

如果 Web 服务有时将组作为数组返回,有时作为单个元素返回,您可以这样做:

if (!isset($val_array['groups'][0])) {
    $val_array['groups'] = array($val_array['groups']);
}

这会检查组是否是一个数组。如果没有,它会创建一个包含单个元素的数组。然后,您可以在其余代码中将其作为数组一致地处理。

【讨论】:

  • 我只需要知道尺寸。我的 JSON 已更正(我已更正)。 @Barmar
  • 这很好用。但问题是,当我向 Web 服务发出 GET 请求时,我得到了这个 JSON,所以当只有一个元素时,没有 []。所以我无法手动更改。 @Barmar
  • 不要将true 选项用于json_decode。然后可以测试$val_array-&gt;groups的类型是数组还是对象。
  • 如果是数组则需要遍历,如果是对象则可以直接访问。
  • 致命错误:当我没有使用 json_decode 的 true 选项时,无法使用 stdClass 类型的对象作为数组@Barmar。
【解决方案2】:

正如@barmar 指出的那样,您的 JSON 数据格式不正确。如果您已经有正确的 JSON 格式,您可以使用它并通过foreach 循环输出到表格。考虑这个例子:

<?php

$raw = '{ "groups":[ { "connect":"yes", "Name":"admin", "id":"1", "Groups":"1", "manage":"1", "Users":"1", "show":"1", "log":"1" }, { "connect":"no", "Name":"noadmin", "id":"2", "Groups":"2", "manage":"2", "Users":"2", "show":"2", "log":"2" } ]}';
$data = json_decode($raw, true);
$data = reset($data); // flatten
$headers = array_keys(reset($data)); // get the header and use it as your headings/headers

?>

<!-- simple foreach loop -->
<table border="1" cellpadding="10">
<thead>
    <tr>
    <!-- loop the headers -->
    <?php foreach($headers as $value): ?>
        <td><?php echo $value; ?></td>
    <?php endforeach; ?>
    </tr>
</thead>
<tbody>
<?php foreach($data as $value): ?>
    <tr>
        <!-- then loop the values -->
        <?php foreach($value as $element):?>
            <td><?php echo $element; ?></td>
        <?php endforeach; ?>
    </tr>
<?php endforeach; ?>
</tbody>
</table>

Sample Output

【讨论】:

    【解决方案3】:

    我发现了问题。将 $val_array['Log'] 更改为 $val_array['log']。

    $json_data = '{
       "groups": [{
       "connect": "yes",
       "Name": "admin",
       "id": "1",
       "Groups": "1",
       "manage": "1",
       "Users": "1",
       "show": "1",
       "log": "1"
    },
     {
       "connect": "no",
       "Name": "noadmin",
       "id": "2",
       "Groups": "2",
       "manage": "2",
       "Users": "2",
       "show": "2",
       "log": "2"
    }] }';
    
    $val_array = json_decode($json_data, true);
    
    foreach($val_array["groups"] as $key=>$value){
    
    $a= $value['connect'];
    $b= $value['Name'];
    $c= $value['id'];
    $d= $value['Groups'];
    $e= $value['manage'];
    $f= $value['Users'];
    $g= $value['show'];
    $h= $value['log'];
    echo $h;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 2018-10-27
      • 2015-03-26
      • 2010-10-10
      相关资源
      最近更新 更多