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

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

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

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

2回答

589閲覧

JSONデータの成形

szk_1221

総合スコア13

JSON

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2019/07/10 06:33

編集2019/07/11 01:57

前提・実現したいこと

外部のAPIから受け取ったJSONデータを成形して出力したい。

外部のAPIから受け取ったJSON↓を

json

1{ 2 "message": { 3 "listValue": { 4 "values": [ 5 { 6 "structValue": { 7 "fields": { 8 "replyPayload": { 9 "structValue": { 10 "fields": { 11 "title": { 12 "structValue": { 13 "fields": { 14 "format": { 15 "boolValue": false, 16 "kind": "boolValue" 17 }, 18 "text": { 19 "stringValue": "選択", 20 "kind": "stringValue" 21 } 22 } 23 }, 24 "kind": "structValue" 25 }, 26 "comflow": { 27 "structValue": { 28 "fields": { 29 "button": { 30 "listValue": { 31 "values": [ 32 { 33 "structValue": { 34 "fields": { 35 "webview": { 36 "boolValue": false, 37 "kind": "boolValue" 38 }, 39 "label": { 40 "structValue": { 41 "fields": { 42 "format": { 43 "boolValue": false, 44 "kind": "boolValue" 45 }, 46 "text": { 47 "stringValue": "トップに戻る", 48 "kind": "stringValue" 49 } 50 } 51 }, 52 "kind": "structValue" 53 }, 54 "webview": { 55 "boolValue": false, 56 "kind": "boolValue" 57 }, 58 "event": { 59 "structValue": { 60 "fields": { 61 "name": { 62 "stringValue": "eventName1", 63 "kind": "stringValue" 64 } 65 } 66 }, 67 "kind": "structValue" 68 } 69 } 70 }, 71 "kind": "structValue" 72 }, 73 { 74 "structValue": { 75 "fields": { 76 "event": { 77 "structValue": { 78 "fields": { 79 "name": { 80 "stringValue": "eventName2", 81 "kind": "stringValue" 82 } 83 } 84 }, 85 "kind": "structValue" 86 }, 87 "webview": { 88 "boolValue": false, 89 "kind": "boolValue" 90 }, 91 "label": { 92 "structValue": { 93 "fields": { 94 "format": { 95 "boolValue": false, 96 "kind": "boolValue" 97 }, 98 "text": { 99 "stringValue": "前に戻る", 100 "kind": "stringValue" 101 } 102 } 103 }, 104 "kind": "structValue" 105 } 106 } 107 }, 108 "kind": "structValue" 109 } 110 ] 111 }, 112 "kind": "listValue" 113 } 114 } 115 }, 116 "kind": "structValue" 117 } 118 } 119 }, 120 "kind": "structValue" 121 } 122 } 123 }, 124 "kind": "structValue" 125 } 126 ] 127 }, 128 "kind": "listValue" 129 } 130}

このような形↓にしたいのですがうまくいきません。

json

1{ 2 "message": [ 3 { 4 "replyPayload": { 5 "title": { 6 "format": false, 7 "text": "選択" 8 }, 9 "comflow": { 10 "button": [ 11 { 12 "label": { 13 "format": false, 14 "text": "トップに戻る" 15 }, 16 "event": { 17 "name": "eventName1" 18 } 19 }, 20 { 21 "webview": false, 22 "label": { 23 "format": false, 24 "text": "前に戻る" 25 }, 26 "event": { 27 "name": "eventName2" 28 } 29 } 30 ] 31 } 32 } 33 } 34 ] 35}

追記:試したコード・結果

試したコード↓

javascript

1let message = data.payload.fields.message; 2const analysisArr = []; 3analysis(message); 4let payload = {message : analysisArr}; 5console.log(payload); 6 7function analysis(obj) { 8 try { 9 console.log('obj => ' + JSON.stringify(obj)); 10 let box = {}; 11 if (obj.structValue) { 12 box = obj.structValue.fields; 13 Object.keys(box).forEach(function(key) { 14 analysisArr.push({[key] : {}}); 15 console.log('analysisArr => ' + JSON.stringify(analysisArr)); 16 analysis(box[key], key); 17 }); 18 } else if (obj.listValue) { 19 analysisArr.push([]); 20 console.log('analysisArr => ' + JSON.stringify(analysisArr)); 21 box = obj.listValue.values; 22 box.forEach(function(val, key) { 23 analysis(val); 24 }); 25 } else if (obj.stringValue) { 26 const l = analysisArr.length; 27 const parent = analysisArr[l-1]; 28 const parentKey = Object.keys(parent); 29 parent[parentKey[0]] = obj.stringValue; 30 console.log('analysisArr => ' + JSON.stringify(analysisArr)); 31 for (let i = l-2; i > -1; i--) { 32 if (Object.prototype.toString.call(analysisArr[i]) === '[object Object]') { // 自分 33 const cpm = analysisArr[i]; 34 console.log('\ncpm => ' + JSON.stringify(cpm)); 35 const keyArr = Object.keys(cpm); 36 const child = analysisArr[i+1]; 37 if (Object.prototype.toString.call(cpm[keyArr[0]]) === '[object Object]' && !Object.keys(cpm[keyArr[0]]).length) { // 自分のプロパティ 38 if (Object.prototype.toString.call(child) === '[object Array]') { // child 39 cpm[keyArr[0]] = child; 40 } else { 41 const childKey = Object.keys(child); 42 const type = Object.prototype.toString.call(child[childKey[0]]); 43 console.log('type => ' + type); 44 if (type === '[object Object]' || type === '[object String]' || type === '[object Number]' || type === '[object Boolean]') { // childのプロパティ 45 cpm[keyArr[0]] = {[childKey[0]] : child[childKey[0]]}; 46 } else if (Object.prototype.toString.call(child[childKey[0]]) === '[object Array]') { 47 cpm[keyArr[0]] = child; 48 } 49 } 50 } else if (Object.prototype.toString.call(cpm[keyArr[0]]) === '[object Object]' && Object.keys(cpm[keyArr[0]]).length) { 51 if (Object.prototype.toString.call(child) === '[object Array]') { // child 52 cpm[keyArr[0]] = child; 53 //nestCount++; 54 } else { 55 const childKey = Object.keys(child); 56 cpm[childKey[0]] = child[childKey[0]]; 57 //nestCount++; 58 } 59 } else if (Object.prototype.toString.call(cpm[keyArr[0]]) === '[object Array]') { 60 cpm[keyArr[0]].push(child); 61 } 62 analysisArr.pop(); 63 console.log('analysisArr => ' + JSON.stringify(analysisArr)); 64 } else if (Object.prototype.toString.call(analysisArr[i]) === '[object Array]') { 65 const child = analysisArr.pop(); 66 analysisArr[i].push(child); 67 console.log('\nis Array'); 68 console.log('analysisArr => ' + JSON.stringify(analysisArr)); 69 } 70 } 71 } 72 return null; 73 74 } catch(error) { 75 console.log(error); 76 return null; 77 } 78}

結果

{ "message": [ [ { "replyPayload": { "title": { "text": "選択" } } }, { "format": false }, { "comflow": { "button": [ { "label": { "text": "トップに戻る" } } ] } }, { "format": false }, { "event": { "name": "eventName1" } }, { "event": { "name": "eventName2" } }, { "webview": false }, { "label": { "format": false } }, { "text": "前に戻る" } ] ] }

配列のときは listValue:{values:[]},
オブジェクトのときは structValue:{fields:{}},
文字列のときは stringValue:"文字列",
論理型のときは boolValue:論理値,
になっているのはわかったのですがどうすれば下の形にできるかわかりません。
やり方がわかる方いましたら教えてください。

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

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

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

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

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

m.ts10806

2019/07/10 06:37

Node.js詳しいわけではないですが、「うまくいかない」コードを提示し「何が起きるのか」等、状況を具体的に記載してください。
papinianus

2019/07/10 09:43

選択、という文字列がなくどうしたいかがわかりません。ルールを教えて下さい
guest

回答2

0

ベストアンサー

こんな感じで如何でしょうか?

javascript

1const func = targetObj => { 2 const fuga = obj => { 3 if ('object' !== typeof obj) return obj; 4 if ('kind' in obj) return hoge[obj.kind](obj); 5 return fuho(obj); 6 }; 7 8 const fuho = plainObj => 9 Object.entries(plainObj).reduce((acc, [key, value]) => { 10 acc[key] = fuga(value); 11 return acc; 12 }, {}); 13 14 const hoge = { 15 structValue: obj => fuho(obj.structValue.fields), 16 listValue: obj => obj.listValue.values.map(value => fuga(value)), 17 boolValue: obj => obj.boolValue, 18 stringValue: obj => obj.stringValue 19 }; 20 21 return fuga(targetObj); 22};

投稿2019/07/11 04:23

chanLettuce

総合スコア28

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

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

0

とりあえず、ごりごりと書いてみました。

js

1var obj = JSON.parse(` 2// 略 3`); 4 5function stringValue(obj){ 6 return obj.stringValue; 7} 8function boolValue(obj){ 9 return obj.boolValue; 10} 11function listValue(obj){ 12 return obj.listValue.values; 13} 14function structValue(obj){ 15 return obj.structValue.fields; 16} 17 18function test(obj){ 19 if (obj.constructor === Array) return obj.map(test); 20 if (obj.constructor !== Object) return obj; 21 switch (obj.kind) { 22 case 'stringValue': 23 return test(stringValue(obj)); 24 case 'boolValue': 25 return test(boolValue(obj)); 26 case 'listValue': 27 return test(listValue(obj)); 28 case 'structValue': 29 return test(structValue(obj)); 30 default: 31 return Object.entries(obj).reduce(function(pv, [k,v]){ 32 pv[k] = test(v); 33 return pv; 34 },{}) 35 } 36} 37 38JSON.stringify(test(obj), null, 2); 39 40 41/* 42{ 43 "message": [ 44 { 45 "replyPayload": { 46 "comflow": { 47 "button": [ 48 { 49 "webview": false, 50 "label": { 51 "format": false, 52 "text": "端末選択に戻る" 53 }, 54 "event": { 55 "name": "eventName1" 56 } 57 }, 58 { 59 "event": { 60 "name": "eventName2" 61 }, 62 "webview": false, 63 "label": { 64 "format": false, 65 "text": "メニューに戻る" 66 } 67 } 68 ] 69 }, 70 "title": { 71 "format": false, 72 "text": "メニューまたは機種選択に戻る場合は、下のボタ ンを押してください。" 73 } 74 } 75 } 76 ] 77} 78*/ 79*/

たぶん、もう少し待っていると、miyabi-sunさんという回答者さんが、Lodashでのコードを教えてくれるはずです(無茶振り)

投稿2019/07/11 03:03

編集2019/07/11 03:28
Lhankor_Mhy

総合スコア36104

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問