JSONを使用してAPIを実行する場合、id
フィールドではなく常に id_str
フィールドを使用するようにしてください。
これは、JSONを扱うJavascript やその他プログラミング言語における、桁の大きな数字を処理する方法がネックとなっているからです。
id
とid_str
の内容が一致しない状況が発生した場合、それはIDの数値を解析・処理したあなたの開発環境に問題があります。
Twitter でどのようにIDが生成されるかについての詳細情報を以下を読んでください。
snowflake-based IDが与えられるツイートに加え、2011年9月30日からはダイレクトメッセージにも snowflake 64-bit 整数が割り振られるようになりました。
Twitter IDsWhen consuming the API using JSON, it is important to always use the field In addition to Tweets being given snowflake-based IDs, direct messages will also be snowflake 64-bit integers beginning September 30th, 2011. |
Snowflake とは、我々が重複のないTweet IDを生成するのに使用しているサービスのことです。これらのツイートIDは重複のない64ビットの符号なし整数で、現在のIDのように数字を順番に割り振るのではなく、時間を基に生成されます。このIDはタイムスタンプと worker numberとシーケンス番号で構成されています。
So what is Snowflake?Snowflake is a service we will be using to generate unique Tweet IDs. These Tweet IDs are unique 64bit unsigned integers, which, instead of being sequential like the current IDs, are based on time. The full ID is composed of a timestamp, a worker number, and a sequence number. |
Twitter立ち上げ前に、Javascript のような一部のプログラム言語は53bitsの数字をサポートしていないということが我々の中で問題に上がりました。
この問題は、ブラウザコンソール上で(90071992547409921).toString()
といった文字列変換コマンドを実行したり、以下のJSON をあなたが使っているJSON パーサーで実行してみることですぐに確認することができます。
{"id": 10765432100123456789, "id_str": "10765432100123456789"}
この影響を受けるJSON パーサーでは、ID の変換に失敗して精度が失われます。パーサーによっては例外が発生するかもしれません。
The problemBefore launch it came to our attention that some programming languages such as Javascript cannot support numbers with >53bits. This can be easily examined by running a command similar to: {"id": 10765432100123456789, "id_str": "10765432100123456789"} In affected JSON parsers the ID will not be converted successfully and will lose accuracy. In some parsers there may even be an exception. |
javascript とJSON パーサーがIDを読み取れるようにするには、JSON 形式の応答を取得する際にはIDを文字列として取得する必要があります。 Twitter API 実行時のJSON 応答において、ステータスID、ユーザーID、ダイレクトメッセージID、検索IDは、現状では数値と文字列の両方が取得されています。 この仕様はメインのTwitter API、ストリーミングAPI、検索APIに適用されています。
例えば、status オブジェクトは現在 id
と id_str
を保持しています。status オブジェクトを表した以下のJSONデータでは、各データポイントごとにIDフィールドが二種類あるのが見えるでしょう。
[ { "coordinates": null, "truncated": false, "created_at": "Thu Oct 14 22:20:15 +0000 2010", "favorited": false, "entities": { "urls": [ ], "hashtags": [ ], "user_mentions": [ { "name": "Matt Harris", "id": 777925, "id_str": "777925", "indices": [ 0, 14 ], "screen_name": "themattharris" } ] }, "text": "@themattharris hey how are things?", "annotations": null, "contributors": [ { "id": 819797, "id_str": "819797", "screen_name": "episod" } ], "id": 12738165059, "id_str": "12738165059", "retweet_count": 0, "geo": null, "retweeted": false, "in_reply_to_user_id": 777925, "in_reply_to_user_id_str": "777925", "in_reply_to_screen_name": "themattharris", "user": { "id": 6253282, "id_str": "6253282" }, "source": "web", "place": null, "in_reply_to_status_id": 12738040524, "in_reply_to_status_id_str": "12738040524" } ]
The solutionTo allow javascript and JSON parsers to read the IDs we need to include a string version of any ID when responding in the JSON format. What this means is Status, User, Direct Message and Saved Search IDs in the Twitter API will now be returned as an integer and a string in JSON responses. This will apply to the main Twitter API, the Streaming API and the Search API. For example, a status object will now contain an [ { "coordinates": null, "truncated": false, "created_at": "Thu Oct 14 22:20:15 +0000 2010", "favorited": false, "entities": { "urls": [ ], "hashtags": [ ], "user_mentions": [ { "name": "Matt Harris", "id": 777925, "id_str": "777925", "indices": [ 0, 14 ], "screen_name": "themattharris" } ] }, "text": "@themattharris hey how are things?", "annotations": null, "contributors": [ { "id": 819797, "id_str": "819797", "screen_name": "episod" } ], "id": 12738165059, "id_str": "12738165059", "retweet_count": 0, "geo": null, "retweeted": false, "in_reply_to_user_id": 777925, "in_reply_to_user_id_str": "777925", "in_reply_to_screen_name": "themattharris", "user": { "id": 6253282, "id_str": "6253282" }, "source": "web", "place": null, "in_reply_to_status_id": 12738040524, "in_reply_to_status_id_str": "12738040524" } ] |
まず最初にすべきは、あなたのプログラムのJSONパーサーを使用して上記JSONデータをデコードすることです。 その出力結果を見て、JDの精度が失われていないか確認してください。
上記の結果次第で次にやるべきことが変わってきます:
What should you do - RIGHT NOWThe first thing you should do is attempt to decode the JSON snippet above using your production code parser. Observe the output to confirm the ID has not lost accuracy. What you do next depends on what happens:
|
Summary
|