JSONデータを成形して出力する
やりたいこと
外部のAPIから受け取ったJSON↓を
{
"message": {
"listValue": {
"values": [
{
"structValue": {
"fields": {
"replyPayload": {
"structValue": {
"fields": {
"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"
},
"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"
},
"title": {
"structValue": {
"fields": {
"format": {
"boolValue": false,
"kind": "boolValue"
},
"text": {
"stringValue": "メニューまたは機種選択に戻る場合は、下のボタ ンを押してください。",
"kind": "stringValue"
}
}
},
"kind": "structValue"
}
}
},
"kind": "structValue"
}
}
},
"kind": "structValue"
}
]
},
"kind": "listValue"
}
}
このような形↓にしたいのですがうまくいきません。
{
"message": [
{
"replyPayload": {
"title": {
"format": false,
"text": "選択"
},
"comflow": {
"button": [
{
"label": {
"format": false,
"text": "トップに戻る"
},
"event": {
"name": "eventName1"
}
},
{
"webview": false,
"label": {
"format": false,
"text": "前に戻る"
},
"event": {
"name": "eventName2"
}
}
]
}
}
}
]
}
試したコード・結果
試したコード↓
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:論理値,
になっているのはわかったのですがどうすれば下の形にできるかわかりません。
やり方がわかる方いましたら教えてください。