JSON 2 CSV Converter

Deep JSON to CSV Converter...

by Alex

HTML

<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.1/css/bootstrap.min.css">
<h1>JSON to CSV Converter</h1>

<p>Paste Your JSON Here:</p>
<textarea id="json" class="form-control" rows="10">
    [ 
        {"id":1,"user":{"forename":"Sam", "surname": "Smith"}},
        {"id":2,"user":{"forename":"Fred", "surname": "Frankly"}}, 
        {"id":1,"user":{"forename":"Zachary", "surname": "Zupers"}} 
    ]</textarea>
<p>
    <button id="convert" class="btn btn-primary">Convert to CSV</button>&nbsp;&nbsp;
    <button id="download" class="btn btn-default">Download CSV</button>
</p>
<textarea id="csv" class="form-control" rows="10"></textarea>

CSS

body { margin:20px; font-family: Helvetica; }
p { margin:10px; }
textarea{ width:100%; }

JavaScript

$("#convert").click(function() {
  var json = $.parseJSON($("#json").val());
  var csv = json2csv(json, PASTE_DELIMITER);
  $("#csv").val(csv);
});

$("#download").click(function() {
  var json = $.parseJSON($("#json").val());
  var csv = json2csv(json, DL_DELIMITER);
  window.open("data:text/csv;charset=utf-8," + escape(csv))
});

///###########################################
var DL_DELIMITER = ";";
var PASTE_DELIMITER = "\t";

function quote(val) {
  val = String(val);
  return '"' + val.replace(/"/g, '""') + '"';
}

function obj2str(obj, delimiter) {
  var resp = "";
  for (var n in obj) {
    if (typeof obj[n] == "object") {
      resp += obj2str(obj[n], delimiter);
    } else {
      resp += "" + quote(obj[n]) + "" + delimiter;
    }
  }
  return resp;
}

function obj2head(obj, delimiter) {
  var resp = "";
  for (var n in obj) {
    if (typeof obj[n] == "object") {
      resp += obj2head(obj[n], delimiter);
    } else {
      resp += "" + quote(n) + "" + delimiter;
    }
  }
  return resp;
}

function json2csv(json, delimiter) {
  var head = "";
  var csv = "";
  if (json.hasOwnProperty('rows')) {
    json = json.rows;
  }
  for (var i in json) { // walks tha array
    var obj = json[i];
    var line = "";
    if (head == "") {
      head += obj2head(obj, delimiter);
    }
    line += "" + obj2str(obj, delimiter);
    csv += line + "\n";
  }
  return head + "\n\n" + csv;
}