質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1012閲覧

javascriptのオブジェクト型データへ変数を渡すにはどうしたら良いでしょうか?

mvc_php

総合スコア19

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/01/28 18:20

編集2021/01/29 10:25

YDNサイトリターゲティングタグをコンテンツ(買い物かご内)に設置したいと考えています。

下記のタグを作成して買い物かごheaderへ設置しましたが、
変数 result を yahoo_retargeting_items 属性に指定したのですが発火しませんでした。

オブジェクト型のデータへ変数を渡してあげるにはどのように指定すれば良いでしょうか。
大変お手数ですがご教示のほど宜しくお願い申し上げます。

<script> var strItems = "{item_id: 'item155', category_id: '', price: '1590', quantity: '1'},"; var result = strItems.slice(0, -1); window.yjDataLayer = window.yjDataLayer || []; function ytag() { yjDataLayer.push(arguments); } ytag({ "type":"yjad_retargeting", "config":{ "yahoo_retargeting_id": "XXXXXXXXX", "yahoo_retargeting_label": "cart", "yahoo_retargeting_page_type": "cart", "yahoo_retargeting_items":[ result ] } }); </script>

変数 strItems はECショップオリジナルのタグで生成されるので2商品カートに入っていればこのような内容になります。

var strItems = "{item_id: 'item155', category_id: '', price: '1590', quantity: '1'},{item_id: 'item156', category_id: '', price: '2200', quantity: '1'},";

末尾のカンマが不要になるので末尾1文字を slice しています。

var result = strItems.slice(0, -1);

またコードの発火確認は、Google Chrome デベロッパーツール(Network)でしています。


★2021/1/29 追記です。

以下はYahooガイドに掲載されていた完成例です。
「yahoo_retargeting_items」というプロパティへオブジェクトな配列になるように配列を追加していかなければなりません。

<script> window.yjDataLayer = window.yjDataLayer || []; function ytag() { yjDataLayer.push(arguments); } ytag({ "type":"yjad_retargeting", "config":{ "yahoo_retargeting_id": "XXXXXXXXX", "yahoo_retargeting_label": "cart", "yahoo_retargeting_page_type": "cart", "yahoo_retargeting_items":[ {item_id: 'item1', category_id: 'cate1', price: '100', quantity: '1'} ,{item_id: 'item2', category_id: 'cate2', price: '200', quantity: '2'} ,{item_id: 'item10', category_id: 'cate10', price: '1000', quantity: '10'} ] } }); </script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

的外れかもしれませんが。

yahoo_retargeting_itemsで要求されるのはオブジェクトの配列ではないでしょうか?
resultに入っているのは文字列であることに注意しましょう。

また、resultに入っているのはJSONとしては不適合です。
そのままJSON.parseに渡してもエラーで弾かれるだけですので、JSONに適合出来るように構成して下さい。

※追記
JSONは配列も構成要素として記述できます。こんな感じで。

javascript

1var strItems = '[{"item_id": "item1", "category_id": "", "price": "1200", "quantity": "1"},{"item_id": "item2", "category_id": "", "price": "2000", "quantity": "1"}]'; 2var obj = JSON.parse(strItems);

この場合、objの中身は"オブジェクト二つを要素として持つ配列"となりますので、
yahoo_retargeting_itemsに渡すのは[obj]ではなくobjになります。

javascript

1... 2"yahoo_retargeting_items":obj 3...

※更に追記
JSONをどのように記述すればいいかはRFC8259(リンク先は日本語訳)で厳密な書式が定義されています。
手っ取り早く構造化されたデータをJSONに変換したいのであれば、JSON.stringifyを使えばokです。

投稿2021/01/29 01:05

編集2021/01/30 03:57
AT_2nd

総合スコア266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mvc_php

2021/01/29 10:09

ご回答いたきまして有難う御座います。 >yahoo_retargeting_itemsで要求されるのはオブジェクトの配列ではないでしょうか? はい、その通りです。 オブジェクトの配列を要求されております。 JSONについて初めてでしたので調べてみたところ、フォーマットが同じでした。 JSONに適合できるように下記のように書いてみました。 var obj = '{"item_id": "item1", "category_id": "", "price": "1200", "quantity": "1"}'; var result = JSON.parse(obj); window.yjDataLayer = window.yjDataLayer || []; function ytag() { yjDataLayer.push(arguments); } ytag({ "type":"yjad_retargeting", "config":{ "yahoo_retargeting_id": "XXXXXXXXX", "yahoo_retargeting_label": "cart", "yahoo_retargeting_page_type": "cart", "yahoo_retargeting_items":[ result ] } }); 無事に発火することを確認できました。 しかしながら、下記のように商品が2個以上の場合はうまくいかず困っております。 var obj = '{"item_id": "item1", "category_id": "", "price": "1200", "quantity": "1"},{"item_id": "item2", "category_id": "", "price": "2000", "quantity": "1"}'; var strItems = JSON.parse(obj); この内容ではJSONに適合しないでしょうか? 大変お手数ですがご教示のほど宜しくお願い致します。
mvc_php

2021/01/29 10:28

追記させていただきます。 商品を2つ追加した際のエラー内容です。 Uncaught SyntaxError: Unexpected token , in JSON at position 73 at JSON.parse (<anonymous>)
mvc_php

2021/02/07 17:16

ご連絡が大変遅くなり申し訳御座いません。 持病が悪化し暫く休んでいて昨夕から復帰致しました。 「オブジェクト2つを要素として持つ」というところが鍵だったんですね。 構造化されたデータを JSON.stringify を使って最後に JSON.parse すると良いわけですね。(とても画期的ですね!) リファレンスのご紹介までいただきまして有難う御座います。勉強になります! 当初は何が何やら分からず、挫折しそうでしたがJSONに直に触れることで楽しくなってきました。 このようなキッカケをいただけて大変嬉しく思います。 有難う御座います。 objの各要素はカート内のタグで自動出力されるので末尾の「,」カンマが不要になり、 最終的に末尾2文字までをスライスして end-array を代入して JSON.parse することにしました。 var obj = '[{"item_id": "item1","category_id":"","price":"1200","quantity":"1"},{"item_id": "item2","category_id":"","price":"2000","quantity":"1"},]'; obj = obj.slice(0, -2); obj += "]"; var json = JSON.parse(obj); window.yjDataLayer = window.yjDataLayer || []; function ytag() { yjDataLayer.push(arguments); } ytag({ "type":"yjad_retargeting", "config":{ "yahoo_retargeting_id": "XXXXXXXX", "yahoo_retargeting_label": "cart", "yahoo_retargeting_page_type": "cart", "yahoo_retargeting_items":json } }); 配列の長さの分、for や foreach でまわして配列を作成するのが正しい方法なのかと思いますが... 今後は試行錯誤しながら納得のいくように頑張ってみたいと思います。 的確なアドバイスを本当に有難う御座いました。
guest

0

最善策かわかりませんがytagに引数を参照させるところからでは?
function(arg){hoge.push(arg)}

どうしてもargumentsからひっぱりたいなら

javascript

1var a=[]; 2function func(){ 3 a.push(...arguments); 4} 5func("hoge"); 6console.log(a);

投稿2021/01/29 00:07

編集2021/01/29 00:15
yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mvc_php

2021/01/29 06:51

ご回答いたきまして有難う御座います。 ytagへ引数を参照させることをすっかり失念していました。 ヒントを与えていただきまして有難う御座います。 下記のように function items() へ配列を渡してみました。 var arry = []; function items(){ arry.push(...arguments); } items('item1','1000','1','item2','2000','1','item3','1500','2'); window.yjDataLayer = window.yjDataLayer || []; function ytag() { yjDataLayer.push(arguments); } ytag({ "type":"yjad_retargeting", "config":{ "yahoo_retargeting_id": "XXXXXXXXXX", "yahoo_retargeting_label": "cart", "yahoo_retargeting_page_type": "cart", "yahoo_retargeting_items":[ {item_id: arry[0], category_id: '', price: arry[1], quantity: arry[2]} ,{item_id: arry[3], category_id: '', price: arry[4], quantity: arry[5]} ,{item_id: arry[6], category_id: '', price: arry[7], quantity: arry[8]} ] } }); 配列数は商品3個の場合ですと 上記で発火を確認できましたが、 商品10個までを取得できるように単純に下記のようにしてみました。 "yahoo_retargeting_items":[ {item_id: arry[0], category_id: '', price: arry[1], quantity: arry[2]} ,{item_id: arry[3], category_id: '', price: arry[4], quantity: arry[5]} ,{item_id: arry[6], category_id: '', price: arry[7], quantity: arry[8]} ,{item_id: arry[9], category_id: '', price: arry[10], quantity: arry[11]} ,{item_id: arry[12], category_id: '', price: arry[13], quantity: arry[14]} ,{item_id: arry[15], category_id: '', price: arry[16], quantity: arry[17]} ,{item_id: arry[18], category_id: '', price: arry[19], quantity: arry[20]} ,{item_id: arry[21], category_id: '', price: arry[22], quantity: arry[23]} ,{item_id: arry[24], category_id: '', price: arry[25], quantity: arry[26]} ,{item_id: arry[27], category_id: '', price: arry[28], quantity: arry[29]} ] 商品10個をカートに入れた場合は正常に発火しましたが 商品が10個未満の場合ですと発火しませんでした。 その場合はどのような考え方をすべきでしょうか。 大変お手数ですがご教示のほど宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問