やりたいこと

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