PHP中的JSON解析错误

PHP中的JSON解析错误,php,mysql,arrays,json,Php,Mysql,Arrays,Json,我解码了一个JSON数组并将其存储到一个变量中。JSON具有来自服务器端的数据 当我var dump这个数组var_dump$val_数组时;我得到: 我检查数组的大小 { "groups": { "connect": "yes", "Name": "admin", "id": "1", "Groups": "1", "manage": "1", "Users": "1", "

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

当我var dump这个数组var_dump$val_数组时;我得到:

我检查数组的大小

{
    "groups": {
        "connect": "yes",
        "Name": "admin",
        "id": "1",
        "Groups": "1",
        "manage": "1",
        "Users": "1",
        "show": "1",
        "log": "1"
    }
}
当我的数据库中有更多数据时,JSON如下所示

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

我想向html表显示这些值。我使用一个简单的for循环

{
    "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"
              }

我在我的页面中得到:注意:未定义的偏移量:0

大小为8

var_dump($val_array);
作为var_dump输出。

如果组应该是组对象的数组,JSON应该是:

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)
在数组中需要[]。使用这个JSON,count$val_数组['groups']应该返回2,而不是8。看这个

如果web服务有时以数组形式返回组,有时以单个元素形式返回组,则可以执行以下操作:

{
   "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应该是:

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)
在数组中需要[]。使用这个JSON,count$val_数组['groups']应该返回2,而不是8。看这个

如果web服务有时以数组形式返回组,有时以单个元素形式返回组,则可以执行以下操作:

{
   "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"
      }
   ]
}

这将检查组是否为数组。如果不是,它将生成一个包含单个元素的数组。然后,您可以在代码的其余部分将其作为数组进行一致处理。

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

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

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

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

我发现了问题。将$val_数组['Log']更改为$val_数组['Log']

<?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>

我发现了问题。将$val_数组['Log']更改为$val_数组['Log']

<?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>

第二种情况下的JSON格式不正确。结束后需要一个逗号}在groupsCan之后,向我们显示var_dump$val_数组;对于解码后的第二个json字符串。使用foreach而不是for。var_dump什么时候会显示这样的关联数组?它总是将数据类型放在第一位,并在开头显示带有Arraysize的数组,并且在键和值之间显示=>而不是:。这看起来更像原始的JSON,而不是var_dump的输出。即使添加了逗号,它仍然不是有效的JSON。{}围绕对象,每个元素的形式必须为key:value。您没有第二个值的键。您确定它不是组:[{…},{…}]?第二种情况下的JSON格式不正确。结束后需要一个逗号}在groupsCan之后,向我们显示var_dump$val_数组;对于解码后的第二个json字符串。使用foreach而不是for。var_dump什么时候会显示这样的关联数组?它总是将数据类型放在第一位,并在开头显示带有Arraysize的数组,并且在键和值之间显示=>而不是:。这看起来更像原始的JSON,而不是var_dump的输出。即使添加了逗号,它仍然不是有效的JSON。{}围绕对象,每个元素的形式必须为key:value。您没有第二个值的键。你确定它不是组:[{…},{…}]?我只需要知道大小。我的JSON被更正了,我更正了@BarmarThis很好用。但问题是,当我向web服务发出GET请求时,我得到了这个JSON,所以当只有一个元素时,就没有[]。所以我无法手动更改@Barmar不使用true选项进行json_解码。然后,您可以测试$val_array->groups的类型是数组还是对象。如果是数组,您需要对其进行迭代,如果是对象,您可以直接访问它。致命错误:当我没有使用true选项进行json_解码时,无法将stdClass类型的对象用作array@Barmar。我只需要知道大小。我的JSON被更正了,我更正了@BarmarThis很好用。但问题是,当我向web服务发出GET请求时,我得到了这个JSON,所以当只有一个元素时,就没有[]。所以我无法手动更改@Barmar不使用true选项进行json_解码。然后,您可以测试$val_array->groups的类型是数组还是对象。如果是数组,您需要对其进行迭代,如果是对象,您可以直接访问它。致命错误:当我没有使用true选项进行json_解码时,无法将stdClass类型的对象用作array@Barmar。