【问题标题】:print individual value from json decoded field从 json 解码字段打印单个值
【发布时间】:2014-02-07 15:05:49
【问题描述】:

如何打印 json 解码数组的单个值?

$monrow = json_encode($monrow);
$monrow= preg_replace("/_DOT_/",  ".", $monrow);
$monrow = json_decode($monrow,true);

我尝试了以下方法:

var_dump($monrow);  //success, prints the whole array
echo $monrow->name;   //fails with: Notice: Trying to get property of non-object
var_dump($monrow->name);  //fails: same error message
var_dump($monrow->properties);  //fails: properties is of type object or hash

谢谢

【问题讨论】:

  • json解码后你的数组是什么样子的?
  • 那么var_dump($monrow['properties']);呢?

标签: php json symfony get echo


【解决方案1】:

json_encode() 会将一些对象或数组转换为 JSON。 json_decode($var,true) 会将其转换为 ARRAY。 要让一个对象再次使用 json_decode($var) 而不是 true。

【讨论】:

  • 谢谢。我想要数组中的值。并且一个字段是对象类型
【解决方案2】:

尝试获取数组的值,而不是对象的属性:

var_dump($monrow);
echo $monrow['name'];
var_dump($monrow['name']);

你可以检查$monrow是数组还是对象:

if (is_array($monrow)) {
    echo $monrow['name'];
} elseif (is_object($monrow)) {
    echo $monrow->name;
} else {
    // do something else...
}

在你的情况下尝试使用foreach:

foreach ($monrow as $row) {
    if (is_array($row)) {
        // do something with array
        echo $row['name']; // for example
    } elseif (is_object($row)) {
        // do something with object
        echo $row->name; // for example
    } else {
        // maybe do something else if you need...
    }
}

通常在json_decode 之后你有数组或stdClass 的实例。

【讨论】:

  • 谢谢维克多。在我的情况下,其中一个字段是对象类型(所以我有字符串和对象或哈希数组字段)。如何显示对象类型的字段?
  • 在 JSON 解码之后,您的 JSON 对象中的 everything 将作为数组返回。您必须单独将对象解析回它们的容器中。
  • @Kingsley 检查是$monrow 数组或对象,我更新了我的答案。
  • 删除您的评论并将其放在您的问题中,缩进四个空格。
  • @Kingsley,好的,但我在您的 $monrow 转储中没有看到它 (properties),也许您最好展示一下?并尝试使用$monrow 转储来更新您的答案,不要将其作为评论发布。
【解决方案3】:

我不知道 Victor 的回答是什么,但这是你应该如何处理 json_decode:

$decodeToArray = true;
$monrow = json_encode($monrow);
$monrow= preg_replace("/_DOT_/",  ".", $monrow);
$monrow = json_decode($monrow, $decodeToArray);

$parsedArray = array();
foreach ($monrow as $key => $value) {
    if ($decodeToArray) {
        if (is_array($monrow[$key]) && $key == 'properties') {
            $obj = new Object();
            foreach ($monrow[$key] as $property => $contents) {
                $obj->$property = $contents;
            }
            $parsedArray[$key] = $obj;
        } else {
            $parsedArray[$key] = $value;
        }
    } else {
        if (is_object($monrow->$key) && $key == 'properties') {
            $obj = new Object();
            foreach ($monrow->$key as $property => $contents) {
                $obj->$property = $contents;
            }
            $parsedArray[$key] = $obj;
        } else {
            $parsedArray[$key] = $value;
        }
    }
}

同样对于 Victor,json_decode($json, true) 会递归地将整个 JSON 字符串变成一个数组,返回的数组中不会有任何对象:

print_r(json_decode('{"array":[1,2,3],"boolean":true,"null":null,"number":123,"object":{"a":"b","c":"d","e":"f"},"objectArray":[{"a":"b","c":"d","e":"f"},{"a":"b","c":"d","e":"f"},{"a":"b","c":"d","e":"f"}],"string":"Hello World"}', true));

Array
(
    [array] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [boolean] => 1
    [null] => 
    [number] => 123
    [object] => Array
        (
            [a] => b
            [c] => d
            [e] => f
        )

    [objectArray] => Array
        (
            [0] => Array
                (
                    [a] => b
                    [c] => d
                    [e] => f
                )

            [1] => Array
                (
                    [a] => b
                    [c] => d
                    [e] => f
                )

            [2] => Array
                (
                    [a] => b
                    [c] => d
                    [e] => f
                )

        )

    [string] => Hello World
)

【讨论】:

  • 这行不通。你永远不会进入else,只有当$array为空时,当然,如果你的意思是$arrayjson_decode的数组,否则你为什么要$array = true;
  • $array 是一个布尔值...你甚至读过我的代码吗?我将其重命名为$decodeToArray,以便您更好地理解我的代码。
  • 是的,你是对的,但在这种情况下最好使用foreach
  • @Kingsley,我的代码检查了一个名为 properties 的子对象,并将其与父 JSON 对象的其他属性一起放入一个数组中。
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2016-01-18
  • 2013-12-31
  • 2021-10-15
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多