「ツイートが単一なのでtweetedTextList変数を介さなくても良い(tweetedTextを直接表示した)」というのは正しいです。
が、肝心なところが変わっていませんね。
NO.96357の解説は、コードの説明に重点を置きすぎて少し分かりづらかったですかね……。
以下に改めて要点をまとめました。
★注意として、なんとなく読み流すのではなく、1つ1つ理解しながら読み進めてください。
理解できないことがあった場合は、とりあえず読み飛ばしてもらっても構いませんが、何度か通して読み直してみてください。
そうすれば、自分はどこが理解できていて、どこが理解できていないのかが分かると思います。
その上で、理解できない箇所がある場合は「ここまでは分かったけど、ここからが分からない」というように質問していただけると、こちらも答えやすいです。
とにかく、分かること分からないことを整理してみましょう。
▼▼JSONについて▼▼
まず大前提として、JSONは [](角括弧)や {}(波括弧)が入れ子になっている、つまり「階層構造」になっています。
下記リンク先の画像は、Twitter最古のツイートと言われているツイート (
https://twitter.com/Jack/status/20) のIDをshowStatus命令に渡し、getResponseBody命令が返したJSONです。
JSONの画像:
https://imgur.com/a/N1FPDuA
↑全画面:
https://i.imgur.com/Ra1R4g3.png
※さすがに分量のせいか投稿拒否されてしまったので画像にしています
{} の中にまた {} が入っていて、入れ子になっているのが分かるかと思います。
この {} を「オブジェクト」、[] となっているのを「配列」と呼びます。
で、"created_at"や"id"となってるのを「キー」、そのキーの後にある "Tue Mar 21 20:50:14 +0000 2006" や 20 を「値」と呼びます。
値は、HSPの構文と同じでダブルクォーテーションで囲まれてるのが文字列、数値だけなのは数値、HSPでは馴染みがないですがtrue/falseはboolean(bool値)、nullは無(つまりなにもないこと)を意味します。
また、値にオブジェクトや配列を使うこともできます。"entities"キーとその中身のような感じですね。
キーと値のペアを「メンバー」と呼びます。メンバー同士は ,(コンマ)で区切る必要があります。
ここまで大丈夫ですか?
▼▼hspinetのjson系命令について▼▼
json系命令は「JSONポインタ値」と呼ばれる数値で、配列・オブジェクトを識別するのですが……
【訂正】すみません。ずっと {}(とその中身)をオブジェクトとして扱ってきたのですが、どうやらこのjson系命令では「メンバー」もオブジェクトとして扱うようです。というか「配列」も「メンバー」も「オブジェクト」もひっくるめて「オブジェクト」と呼んでいるようです。
ただし、JSONの用語としては「▼▼JSONについて」で説明したのが正しいはずです。これらの命令が特殊なだけだと思うので、JSONの理解はそのままで大丈夫です。
つまり「JSONポインタ値」は、オブジェクトを識別する数値で、JSON用語で書くと 配列・オブジェクト・メンバーを識別する数値です。
なので、json系命令のドキュメントに書いてある「オブジェクト」とは「配列・オブジェクト・メンバー」のことだと思ってください。
▼▼本題▼▼
本題です。今回はコードを最初から見るのではなく、逆に辿ってみましょう。
NO.96395のアルファ研究所SMOPUさんのコードで説明します。
●1. jsongets命令
まず、このコードでツイートの内容である"text"キーの値が取得され、引数1のtweetedText変数に代入されてるのはわかりますよね?
jsongets tweetedText, "text", jsonPtrTweet
引数3のjsonPtrTweet変数には前述した「JSONポインタ値」が入っています。
jsongets命令は、これで示された配列・オブジェクト内にある、"text"キーの値を取得しているわけです。
●2. jsonnext命令
で「jsonPtrTweet変数が示している配列・オブジェクトはなにか」ということですが、この部分になります。
jsonnext jsonPtrTweet, ,1
はい、ではjsonnext命令のドキュメントを見てみましょう。
https://docs.hsp.moe/3.6/reference/hspinet/jsonnext/
引数1は「JSONポインタ値が代入される変数名」ということで、jsonPtrTweet変数にJSONポインタ値が代入されるようですね。
引数2は「JSONポインタ値」とありますが、このコードでは引数2になにも書いておらず、省略されています。
省略した場合ですが、こう書かれています。
> p2を省略またはマイナス値にするとjsonopen命令で読み込ませたデータのルート階層が使用されます。
「ルート階層」というのは、ルート(一番上)にある配列もしくはオブジェクトのことです。
引数3は「取得オプション」です。
「0 次のオブジェクト」や「1 前のオブジェクト」というのは、そのままの意味で、引数2に指定した配列・オブジェクト・メンバーの、次/前にある配列・オブジェクト・メンバーです。
「2 子階層のオブジェクト」というのは、前半の「■JSONについて」で説明した通りJSONは階層構造になっており、「子階層」というのは「中の」という意味です。つまり、中にある配列・オブジェクト・メンバーです。
例えば、上にあるJSONを例にすると、ルート階層の子階層は"created_at"と値の「メンバー」です。
「3 オブジェクトのtype値」というのは、オブジェクトの種類(配列・オブジェクト・メンバー{数値・文字列 など})を表す数値が取得されるのだと思います。
このコードだと引数3に 1 を渡しているので、ルート階層の前の配列・オブジェクト・メンバーを取得しようとしています。
しかし、ルート階層は一番上の配列・オブジェクトなので、前の配列・オブジェクトも、次の配列・オブジェクトも絶対に存在しません。ルート階層は常に1つなのです。
なので、jsonPtrTweet変数はなにも示していない(示すオブジェクトがない)ので 0 です。
存在しないオブジェクトから、jsongets命令で"text"キーの値を取得しようとしても、そもそもオブジェクトが存在しないのですからなにも取得できませんよね?
●3. ではどうすればいいのか
まずルート階層は具体的にどこのことなのか? というと、冒頭のJSONを例にすると"created_at"キーや"text"キーがある一番始めの {}(オブジェクト)のことです。
getUserTimeline命令で取得したJSONは、"text"キーを含むオブジェクトが配列になっていました(NO.96344を参照)。
その配列がルート階層だったわけです。
なので、jsonnext命令で子階層のオブジェクト("text"キーを含むオブジェクト)を取得する必要がありました。
しかし、今回は"text"キーを含むオブジェクトは配列になっておらず、"text"キーを含むオブジェクトがルート階層です。
つまり……?
ちなみに、NO.96357の返信の冒頭で、すでに答えは書いてあります。