読者です 読者をやめる 読者になる 読者になる

【ActionScript】【Flex】jsonデータの扱い方 ※間違いがあったので訂正しました(13:54)

Flex ActionScript

自分で詰まったのでメモ
以下twitterから取ってきたデータ。これを扱います

{"results":[{"profile_image_url":"http://a3.twimg.com/profile_images/749505227/080221_192821_normal.jpg","created_at":"Sun, 09 May 2010 03:17:31 +0000","from_user":"ROHIMOTOWAGAO","metadata":{"result_type":"recent"},"to_user_id":null,"text":"\u306e\u3069\u81ea\u6162\u3001\u306a\u3046\u3002 #NHK","id":13645064760,"from_user_id":90516802,"geo":null,"iso_language_code":"ja","source":"<a href="http://twtr.jp" rel="nofollow">Keitai Web</a>"}],"max_id":13645126842,"since_id":0,"refresh_url":"?since_id=13645126842&q=nhk","next_page":"?page=2&max_id=13645126842&q=nhk","results_per_page":15,"page":1,"completed_in":0.018101,"query":"nhk"}

長すぎるので真ん中の方は削除しました。
見やすくまとめるとこんな感じになっています。

  • results
    • profile_image_url
    • created_at
    • from_user
    • metadata
    • to_user_id
    • text
    • id
    • from_user_id
    • geo
    • iso_language_code
    • source
  • max_id
  • since_id
  • refresh_url
  • next_page
  • result_per_page
  • page
  • completed_in
  • query

ここで、resultは入れ子?の構造になっているので、resultの中にfrom_userだとかがあるわけです。
これを取りたいときは、ライブラリas3corelibを使います
詳しくはこちら
http://clockmaker.jp/blog/2009/11/actionscript-json/

trace(ObjectUtil.toString(json['results']));

こう書けば、resultの中身が以下のように見ることが出来ます。
※traceはjavaで言うと、sysoutだと思って下さい

[{created_at:"Thu, 13 May 2010 01:17:45 +0000", to_user_id:{}, iso_language_code:"ja", from_user_id:108814872, metadata:{result_type:"recent"}, profile_image_url:"http://a3.twimg.com/profile_images/821807495/mixi-piku-2_normal.jpg", text:"これは今夜、ばっちりでそうな感じですね??♪♪昨日もユーザーの方が紹介されてました!RT @unae: ホントだ。w @_Pikuchan_: @unae Bizスポのホームページにunaeさん発見!!!http://ow.ly/1Koz8 #Piku #Bizspo #nhk", from_user:"_Pikuchan_", id:13884319797, geo:{}, source:"<a href="http://www.hootsuite.com" rel="nofollow">HootSuite</a>"}]

長いので省略してあります。(1つ以外は消しました)
create_atから、relまでのデータを1つとして、取ってこれたresult分全て表示されます。

もし

trace(ObjectUtil.toString(json));

記述すると、以下のような結果が帰ってきます

{max_id:13884319797, next_page:"?page=2&max_id=13884319797&q=%23nhk", completed_in:0.021453, refresh_url:"?since_id=13884319797&q=%23nhk", results_per_page:15, since_id:0, page:1, results:[{created_at:"Thu, 13 May 2010 01:17:45 +0000", to_user_id:{}, iso_language_code:"ja", from_user_id:108814872, metadata:{result_type:"recent"}, profile_image_url:"http://a3.twimg.com/profile_images/821807495/mixi-piku-2_normal.jpg", text:"これは今夜、ばっちりでそうな感じですね??♪♪昨日もユーザーの方が紹介されてました!RT @unae: ホントだ。w @_Pikuchan_: @unae Bizスポのホームページにunaeさん発見!!!http://ow.ly/1Koz8 #Piku #Bizspo #nhk", from_user:"_Pikuchan_", id:13884319797, geo:{}, source:"<a href="http://www.hootsuite.com" rel="nofollow">HootSuite</a>"}, query:"%23nhk"}

長いので省略してあります。(resultsの結果2つ以外は消しました)
この場合はよく見ると、上と違って、結果の最後の方にqueryがあったり、max_idとかも表示されています。


resultsを取るときは、

ObjectUtil.toString(json['results'])

resultの0番目のto_user_idを取りたいときは

ObjectUtil.toString(json['results'][0]['from_user'])

resultsの全てのfrom_userを取りたいときは
ダメな例

ObjectUtil.toString(json['results']['from_user'])

これでは何もとってこれません。

json(['results'][i]['from_user'])

とかにしてfor分で回してしまいましょう。

私が引っかかったのはこの先です。
resultsは最初の方でも述べたように子の要素を持っているので、上で述べたようなやり方で取ってこれるのですが、子を持っていない(?)、results_per_pageなどはobjectUtilを使うと、何のデータも帰ってきません。
子がないときは普通に

trace(json['results_per_page']);

で中身を見ることが出来ました…。
子がある場合だけ、ObjectUtilを利用して、そうでないときは、json['オブジェクト名']でいいようです。

追記(13:54)

ObjectUtil.toString(json['results'][0]['from_user'])が駄目なのは、[0]で指定してしまっているので、子がないからです。
ObjectUtilは子の中身を見える様にするためのライブラリだと理解しています。
そのため、使わなかったら

[object,object],[object,object],[object,object]

こんな感じになってしまいます。
このobjectと書かれているものを、実際の中身が見えるように(使えるように)するために、ObjectUtilを利用します。
そのため
×ObjectUtil.toString(json['results'][0]['from_user'])
○json['results'][0]['from_user']


もし、間違いを見つけた方は、ご連絡お願いします!