如何通过它的索引访问JSON属性

时间:2013-07-17 10:44:14

标签: php json

我有以下JSON响应示例(通常是长响应):

  "responseHeader":{
  "status":0,
  "QTime":2,
  "params":{
  "indent":"true",
  "start":"0",
  "q":"hi",
  "wt":"json",
  "rows":"2"}},
"response":{"numFound":69,"start":0,"docs":[
  {
    "id":335,
    "Page":127,
    "dartext":" John Said hi !      ",
    "Part":1},
  {
    "id":17124,
    "Page":127,
    "Tartext":" Mark said hi ",
    "Part":10}]
}}

我只想访问具有字符串类型的属性,问题是属性的名称不是常量所以我不能使用类似的东西:

$obj =json_decode(file_get_contents($data));
$count = $obj->response->numFound;

for($i=0; $i<count($obj->response->docs); $i++){
   echo $obj->response->docs[$i]->dartext;
} 

因为在另一个对象中它不是dartext它是Tartext。

如何通过它的索引访问第三个属性而不是它的名字?

3 个答案:

答案 0 :(得分:1)

你可以尝试这个:

$my_key = array();
$obj =json_decode(file_get_contents($data));
$count = $obj->response->numFound;
$k =1;
foreach ($obj->response->docs as $k => $v) {
    if ($k == 3) {
        $my_key[$k] = $v; // Here you can put your key in 
    }
    $k++;
}

答案 1 :(得分:1)

更好的方法是检查密钥是否存在,因为结果的顺序可以改变

<?php
$response = $obj->response;
foreach($response->docs as $doc) {
    if (isset($doc->dartext)) {
        $text = $doc->dartext;
    } elseif (isset($doc->Tartext)) {
        $text = $doc->Tartext;
    } else {
        $text = '';
    }
}

答案 2 :(得分:0)

来自文档:

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

如果您使用json_decode(file_get_contents($data), true),它将返回一个数组。

之后,您可以执行类似的操作,通过索引而不是键来访问数组。

$keys = array_keys($json);
echo $json[$keys[2]];