我只需要显示 JSON 编码对象的一部分

Posted

技术标签:

【中文标题】我只需要显示 JSON 编码对象的一部分【英文标题】:I need to display only one part of a JSON encoded object 【发布时间】:2015-11-03 14:30:09 【问题描述】:

您好,我是 php 新手,但已成功满足我的要求:

我试图只显示 JSON 解码对象的一部分。我已将对象称为$Results

我可以成功使用var_dump ($Results);,然后得到完整的结果如下:

object(stdClass)[2]
  public '0' => 
    object(stdClass)[3]
      public 'forename_1' => string 'JAMES' (length=5)
      public 'middle1_1' => string '' (length=0)
      public 'middle2_1' => string '' (length=0)
      public 'middle3_1' => string '' (length=0)
      public 'surname_1' => string 'TURNER' (length=7)      
  public 'Status' => int 100

然后我使用以下代码将其插入到表中:

<html>
<form id="client-details" action="/details.php" method="post">
  <table>
    <thead>
        <tr> 
            <th>First Name</th>
            <th>Surname</th>
             <th>Search</th>  
        </tr>
     </thead>
<?php foreach($Results as $o):?>
<tr>
  <td id="forename"><?= $o->forename_1 ?></td>
  <td id="surname"><?= $o->surname_1 ?></td>
  <td><button type="submit" >More Info</button></td>
</tr>
<?php endforeach; ?>
</table></form>
</html>

问题出在这里 当我显示结果时,出现以下错误: “注意:试图获取非对象的属性..”

这似乎是因为我试图运行对象的public 'Status' =&gt; int 100 部分。

所以我的问题是: 如何阻止表格尝试填充该“状态”或如何完全忽略它?

编辑: 如果我愿意,我可以从 json_decode 获得结果作为关联数组而不是对象......这会帮助我忽略“状态”数组/对象吗?

【问题讨论】:

获取结果时查看代码 你的var_dump 只是显示$Result0 有另一个对象,所以你不能这样访问 @wilson - 我在获取结果时检查了代码:$Results = json_decode($Results); 我还可以通过说$Results=json_decode($Results, true); 将 JSON 作为关联数组返回? 【参考方案1】:

我想你弄错了。您正在做的是遍历对象的所有变量,即首先您获得公共变量 0(这也是一个对象),然后在语句 foreach 的第二次运行中您获得变量 Status 并且因为“Status”的值是 int 并且没有名为“forename_1”的属性,依此类推,您会收到该属性不存在的错误。

如果你真的想让它工作,你必须改变 JSON 对象的结构,这样你就可以遍历你想要显示的人的列表,比如:

object(stdClass)[2]
  public 'list' => 
    array(0 => 
        object(stdClass)[3]
          public 'forename_1' => string 'JAMES' (length=5)
          public 'middle1_1' => string '' (length=0)
          public 'middle2_1' => string '' (length=0)
          public 'middle3_1' => string '' (length=0)
          public 'surname_1' => string 'TURNER' (length=7)      
          public 'Status' => int 100,
        1 => 
        object(stdClass)[3]
          public 'forename_1' => string 'JAMES' (length=5)
          public 'middle1_1' => string '' (length=0)
          public 'middle2_1' => string '' (length=0)
          public 'middle3_1' => string '' (length=0)
          public 'surname_1' => string 'TURNER' (length=7)      
          public 'Status' => int 100,
        2 => 
        object(stdClass)[3]
          public 'forename_1' => string 'JAMES' (length=5)
          public 'middle1_1' => string '' (length=0)
          public 'middle2_1' => string '' (length=0)
          public 'middle3_1' => string '' (length=0)
          public 'surname_1' => string 'TURNER' (length=7)      
          public 'Status' => int 100
    )

编辑:

如果您无法或不想更改数据结构,则将函数调用 json_decode 的结果作为关联数组获取,然后在 foreach 语句中检查所需字段是否存在:

$Result = json_decode($data, true);

<?php foreach($Results as $o):?>
    <?php if(isset($o['forename_1']) && isset($o['surname_1'])): ?>
        <tr>
          <td id="forename"><?= $o['forename_1'] ?></td>
          <td id="surname"><?= $o['surname_1'] ?></td>
          <td><button type="submit" >More Info</button></td>
        </tr>
    <?php endif; ?>
<?php endforeach; ?>

【讨论】:

这是一个非常有用的评论!在我的具体情况下,我不能这样做:( --- 我直接从供应商网络服务获取对象,我不想在使用它们之前重建任何数据或结果。【参考方案2】:

我找到了一个可以接受的解决方案! 通过在我的 json_decode 行中添加true

$Results = json_decode($serviceResponse, true);

我将结果作为关联数组而不是对象返回。

然后我将每个&lt;tr&gt; 中的代码更改如下:

<html>
.... (rest of code here)
<?php foreach($Results as $person):?>
         <tr>
           <td id="forename"><?= $person['forename_1'] ?></td>
           <td id="surname"><?= $person['surname_1'] ?></td>
           <td><button type="submit" >More Info</button></td>
         </tr>
<?php endforeach; ?>
     </table>
   </form>
</html>

所以现在发生的情况是,返回错误的最后一行 'status' 现在只是一个空行。 虽然这不是一个完美的解决方案,但当我以 HTML 格式查看页面时,我不介意处理一个空的表格行。

【讨论】:

你可以用这个 if 语句绕过它: "if(isset($person['forename_1']) && isset($person['surname_1']))" 然后显示该行,否则不显示做任何事 我试过了 - 没用......也许我把代码放在了错误的地方......我在这里学习;)【参考方案3】:

试试这个:

<html>
    <form id="client-details" action="/details.php" method="post">
      <table>
        <thead>
            <tr> 
                <th>First Name</th>
                <th>Surname</th>
                 <th>Search</th>  
            </tr>
         </thead>
    <?php foreach($Results as $o=>$v)?>
    <tr>
      <td id="forename"><?= $v->forename_1 ?></td>
      <td id="surname"><?= $v->surname_1 ?></td>
      <td><button type="submit" >More Info</button></td>
    </tr>
    <?php  ?>
    </table></form>
    </html>

【讨论】:

我试过了——没有运气——“状态”一直在尝试迭代【参考方案4】:

尝试这样打印:

<?php foreach($Results as $o):?>
<tr>
  <td id="forename"><?= $o['forename_1']; ?></td>
  <td id="surname"><?= $o['surname_1'] ?></td>
  <td><button type="submit" >More Info</button></td>
</tr>
<?php endforeach; ?>

【讨论】:

以上是关于我只需要显示 JSON 编码对象的一部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在Angular中从ID显示JSON对象(七)

JSON对象的增量编码[关闭]

如何让Jackson JSON生成的数据包含的中文以unicode方式编码

如何在 vue 中仅显示对象的键值

如何仅从 JSON 文件导入不和谐?

axios get请求后访问json数据