要在 Command line 讀取 JSON, 一時找不到可以直接讀取的 Library, 所以就先用 PHP 寫一個來頂.
物件轉換成陣列使用的函式
PHP 使用 json_decode 預設是會回傳物件, 但是物件拿來作 foreach 的處理有點麻煩, 所以需要 Object to Array 的轉換程式.
- 物件 轉換成 陣列 可用: get_object_vars()
CLI 的 JSON Reader PHP 版程式
讀取 CLI 參數, 可用 fgets(STDIN); 或 fgets(fopen('php://stdin', 'r')); 來抓取.
<?php
// json_file content:
// {"version":1.0,"url":"http://tw.yahoo.com"}
// Usage:
// cat json_file | php read_json.php$stdin = get_object_vars(json_decode(fgets(STDIN)));
foreach ($stdin as $k => $v) {
echo "$k = \"$v\"\n"; // print json_decode key => value.
}
?>
但是這個是 JSON 只有一層物件的狀況, 那多層物件的狀況, get_object_vars() 就不太夠用.
於此篇文章 [RESOLVED] foreach stdclass query
有寫好的 Function 可解決此狀況:
<?php
function std_class_object_to_array($stdclassobject)
{
$_array = is_object($stdclassobject) ? get_object_vars($stdclassobject) : $stdclassobject;foreach ($_array as $key => $value) {
$value = (is_array($value) || is_object($value)) ? std_class_object_to_array($value) : $value;
$array[$key] = $value;
}return $array;
}
// print_r(std_class_object_to_array(json_decode($json_str)));
?>
上述 PHP JSON Reader 的程式, 就只需要將 get_object_vars() 換成 std_class_object_to_array() 即可.
另外, 上述的程式看看就好, 不需要去用. XD
註: 感謝小海提醒: json_decode() 第二個參數帶 true, 就會回傳 Array, 而不會回傳物件. XD
因為 CLI 早就有 Perl 版本的程式可以用: json_xs - JSON::XS commandline utility
json_xs 安裝
- apt-get install libjson-xs-perl
json_xs 使用
- $ json_xs -f json # 輸入下面這段 json code
- {"version":1.0,"url":"http://tw.yahoo.com"}
- ^D (Ctrl + D, 下面就是輸出結果)
- {
"version" : 1,
"url" : "http://tw.yahoo.com"
}
json_xs 除了 json 外, 還可以吃 clzf / yaml ... 等格式. 🙂
話說 json_decode 的第二個參數, 丟 true, 就可以回傳 array 了
阿阿阿, 我.... 沒注意到這個... XDDDDD
感謝提醒~ Orz..
$arr = (array) $stdClassInstance;
我剛剛測試, print_r() 的結果: [channel] => SimpleXMLElement Object.
還是 Object 耶.
改天有空來試一下看看