Konvertera json till csv i javascript, typescript


Hej, jag försöker konvertera några JSON till CVS, men jag har ingen tur att analysera det, jag har hittat någon lösning för enkel JSON som ser ut så här

json =  [
    {
      name: "Anil Singh",
      age: 33,
      average: 98,
      approved: true,
      description: "I am active blogger and Author."
    },
    {
      name: 'Reena Singh',
      age: 28,
      average: 99,
      approved: true,
      description: "I am active HR."
    },
    {
      name: 'Aradhya',
      age: 4,
      average: 99,
      approved: true,
      description: "I am engle."
    },
  ];

Och jag har en metod som denna

convertToCSV(objArray, headerList): string {
    const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray;
    let str = '';
    let row = 'S.No,';
    // tslint:disable-next-line: forin
    for (const index in headerList) {
      row += headerList[index] + ',';
    }
    row = row.slice(0, -1);
    str += row + '\r\n';
    for (let i = 0; i < array.length; i++) {
      let line = (i + 1) + '';
      // tslint:disable-next-line: forin
      for (const index in headerList) {
        const head = headerList[index];
        line += ',' + array[i][head];
      }
      str += line + '\r\n';
    }
    return str;
  }

Och kalla det så här

const csvData = this.convertToCSV(json, ['name', 'age', 'average', 'approved', 'description']);

Problemet jag har med ett komplext objekt som ser ut så här

json = [{
        "customer": {
            "emailAddress": "[email "
        },
        "recommendationProductDetails": [{
            "productId": "4288",
            "title": "Title 1",
            "imageWebAddress": "http://url.com/GetImage/2956",
            "webAddress": "http://url.com/",
            "description": "Description 23"
        }, {
            "productId": "8888",
            "title": "Title 8",
            "imageWebAddress": "http://url.com/GetImage/2333",
            "webAddress": "http://url.com/",
            "description": "Description 55"
        }]
    },
    {
        "customer": {
            "emailAddress": "[email "
        },
        "recommendationProductDetails": [{
            "productId": "3333",
            "title": "Title 33",
            "imageWebAddress": "http://url.com/GetImage/333",
            "webAddress": "http://url.com/",
            "description": "Description 333"
        }, {
            "productId": "1111",
            "title": "Title 111",
            "imageWebAddress": "http://url.com/GetImage/111",
            "webAddress": "http://url.com/",
            "description": "Description 111"
        }]
    }
];

Kan någon hjälpa till att formatera detta JSON i CSV, tack

Svar #1

Det finns en liten lösning för att omvandla ett sådant komplext objekt till CSV

Hoppas att koden nedan kommer att vara till hjälp

var jsondata = [{
        "customer": {
            "emailAddress": "[email "
        },
        "recommendationProductDetails": [{
            "productId": "4288",
            "title": "Title 1",
            "imageWebAddress": "http://url.com/GetImage/2956",
            "webAddress": "http://url.com/",
            "description": "Description 23"
        }, {
            "productId": "8888",
            "title": "Title 8",
            "imageWebAddress": "http://url.com/GetImage/2333",
            "webAddress": "http://url.com/",
            "description": "Description 55"
        }]
    },
    {
        "customer": {
            "emailAddress": "[email "
        },
        "recommendationProductDetails": [{
            "productId": "3333",
            "title": "Title 33",
            "imageWebAddress": "http://url.com/GetImage/333",
            "webAddress": "http://url.com/",
            "description": "Description 333"
        }, {
            "productId": "1111",
            "title": "Title 111",
            "imageWebAddress": "http://url.com/GetImage/111",
            "webAddress": "http://url.com/",
            "description": "Description 111"
        }]
    }
];



function flattenObjectKeys(ob) {
    var toReturn = {};

    for (var i in ob) {
        if (!ob.hasOwnProperty(i)) continue;

        if ((typeof ob[i]) == 'object' && ob[i] !== null) {
            var flatObject = flattenObjectKeys(ob[i]);
            for (var x in flatObject) {
                if (!flatObject.hasOwnProperty(x)) continue;

                toReturn[i + '.' + x] = flatObject[x];
            }
        } else {
            toReturn[i] = ob[i];
        }
    }
    return toReturn;
}

function transformToCSV(jsondata, keysArr=[])
{
    var csvData = "";
    var itemList = [];
    jsondata.forEach(customer=>{
        itemList.push(flattenObjectKeys(customer));
    })
    var newKeysNames = Object.keys(itemList[0]);
    var keysMap = {};
    newKeysNames.forEach(newKeyName => {
        keysArr.forEach((oldKeyName)=>{
            let findName = "."+ oldKeyName;
            if( String(newKeyName).indexOf(findName) >= 0)
            {

                keysMap[oldKeyName] = newKeyName;
            }
        })
    });
   // console.log("Keys Map === ", keysMap);
    itemList.forEach((item)=>{
        keysArr.forEach(keyName=>{
            csvData+=item[keysMap[keyName]] +",";
        })
        csvData+='\r\n';
    })


    return csvData;

}

console.log("====================");
console.log(transformToCSV(jsondata, ['title','webAddress','description']));
console.log("====================");