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

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

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

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

Node.js

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

JavaScript

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

解決済

JSONデータの成形

szk_1221
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ブラウザのほとんどに搭載されています。

2回答

0評価

0クリップ

161閲覧

投稿2019/07/10 06:33

編集2019/07/11 01:57

前提・実現したいこと

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

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

json

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

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

json

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

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

試したコード↓

javascript

let message = data.payload.fields.message; const analysisArr = []; analysis(message); let payload = {message : analysisArr}; console.log(payload); function analysis(obj) { try { console.log('obj => ' + JSON.stringify(obj)); let box = {}; if (obj.structValue) { box = obj.structValue.fields; Object.keys(box).forEach(function(key) { analysisArr.push({[key] : {}}); console.log('analysisArr => ' + JSON.stringify(analysisArr)); analysis(box[key], key); }); } else if (obj.listValue) { analysisArr.push([]); console.log('analysisArr => ' + JSON.stringify(analysisArr)); box = obj.listValue.values; box.forEach(function(val, key) { analysis(val); }); } else if (obj.stringValue) { const l = analysisArr.length; const parent = analysisArr[l-1]; const parentKey = Object.keys(parent); parent[parentKey[0]] = obj.stringValue; console.log('analysisArr => ' + JSON.stringify(analysisArr)); for (let i = l-2; i > -1; i--) { if (Object.prototype.toString.call(analysisArr[i]) === '[object Object]') { // 自分 const cpm = analysisArr[i]; console.log('\ncpm => ' + JSON.stringify(cpm)); const keyArr = Object.keys(cpm); const child = analysisArr[i+1]; if (Object.prototype.toString.call(cpm[keyArr[0]]) === '[object Object]' && !Object.keys(cpm[keyArr[0]]).length) { // 自分のプロパティ if (Object.prototype.toString.call(child) === '[object Array]') { // child cpm[keyArr[0]] = child; } else { const childKey = Object.keys(child); const type = Object.prototype.toString.call(child[childKey[0]]); console.log('type => ' + type); if (type === '[object Object]' || type === '[object String]' || type === '[object Number]' || type === '[object Boolean]') { // childのプロパティ cpm[keyArr[0]] = {[childKey[0]] : child[childKey[0]]}; } else if (Object.prototype.toString.call(child[childKey[0]]) === '[object Array]') { cpm[keyArr[0]] = child; } } } else if (Object.prototype.toString.call(cpm[keyArr[0]]) === '[object Object]' && Object.keys(cpm[keyArr[0]]).length) { if (Object.prototype.toString.call(child) === '[object Array]') { // child cpm[keyArr[0]] = child; //nestCount++; } else { const childKey = Object.keys(child); cpm[childKey[0]] = child[childKey[0]]; //nestCount++; } } else if (Object.prototype.toString.call(cpm[keyArr[0]]) === '[object Array]') { cpm[keyArr[0]].push(child); } analysisArr.pop(); console.log('analysisArr => ' + JSON.stringify(analysisArr)); } else if (Object.prototype.toString.call(analysisArr[i]) === '[object Array]') { const child = analysisArr.pop(); analysisArr[i].push(child); console.log('\nis Array'); console.log('analysisArr => ' + JSON.stringify(analysisArr)); } } } return null; } catch(error) { console.log(error); return null; } }

結果

{ "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:論理値,
になっているのはわかったのですがどうすれば下の形にできるかわかりません。
やり方がわかる方いましたら教えてください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

m.ts10806

2019/07/10 06:37

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

2019/07/10 09:43

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JSON

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

Node.js

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

JavaScript

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