diff --git a/README.md b/README.md index b0c469b6..fdd5a765 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,8 @@ try { // data = full data object return row.path1 + row.path2; }, - default: 'NULL' // default if value function returns null or undefined + default: 'NULL', // default if value function returns null or undefined + stringify: true // If value is function use this flag to signal if resulting string will be quoted (stringified) or not (optional, default: true) }, // Support pathname -> pathvalue diff --git a/lib/json2csv.js b/lib/json2csv.js index 764df493..1cfb898f 100644 --- a/lib/json2csv.js +++ b/lib/json2csv.js @@ -215,6 +215,7 @@ function createColumnContent(params, str) { params.fields.forEach(function (fieldElement) { var val; var defaultValue = params.defaultValue; + var stringify = true; if (typeof fieldElement === 'object' && 'default' in fieldElement) { defaultValue = fieldElement.default; } @@ -228,6 +229,9 @@ function createColumnContent(params, str) { default: fieldElement.default }; val = fieldElement.value(dataElement, field, params.data); + if (fieldElement.stringify !== undefined) { + stringify = fieldElement.stringify; + } } if (val === null || val === undefined){ @@ -241,7 +245,10 @@ function createColumnContent(params, str) { .replace(/\r/g, '\u2029'); } - var stringifiedElement = JSON.stringify(val); + var stringifiedElement = val; + if (stringify) { + stringifiedElement = JSON.stringify(val); + } if (params.preserveNewLinesInValues && typeof val === 'string') { stringifiedElement = stringifiedElement diff --git a/test/fixtures/csv/functionNoStringify.csv b/test/fixtures/csv/functionNoStringify.csv new file mode 100644 index 00000000..aa869c84 --- /dev/null +++ b/test/fixtures/csv/functionNoStringify.csv @@ -0,0 +1,3 @@ +"Value1" +"abc" +1234 \ No newline at end of file diff --git a/test/fixtures/csv/functionStringifyByDefault.csv b/test/fixtures/csv/functionStringifyByDefault.csv new file mode 100644 index 00000000..67b348a7 --- /dev/null +++ b/test/fixtures/csv/functionStringifyByDefault.csv @@ -0,0 +1,3 @@ +"Value1" +"abc" +"1234" \ No newline at end of file diff --git a/test/helpers/load-fixtures.js b/test/helpers/load-fixtures.js index a7ac8a6f..04619f57 100644 --- a/test/helpers/load-fixtures.js +++ b/test/helpers/load-fixtures.js @@ -23,6 +23,8 @@ var fixtures = [ 'embeddedjson', 'flattenedEmbeddedJson', 'fancyfields', + 'functionStringifyByDefault', + 'functionNoStringify', 'trailingBackslash', 'excelStrings', 'overriddenDefaultValue', diff --git a/test/index.js b/test/index.js index 784e6e93..4d4a9b50 100644 --- a/test/index.js +++ b/test/index.js @@ -408,6 +408,47 @@ async.parallel(loadFixtures(csvFixtures), function (err) { }); }); + test('function value should stringify results by default', function (t) { + json2csv({ + data: [{ + value1: 'abc' + }, { + value1: '1234' + }], + fields: [{ + label: 'Value1', + value: function (row) { + return row.value1.toLocaleString(); + } + }] + }, function (error, csv) { + t.error(error); + t.equal(csv, csvFixtures.functionStringifyByDefault); + t.end(); + }); + }); + + test('function value do not stringify', function (t) { + json2csv({ + data: [{ + value1: '"abc"' + }, { + value1: '1234' + }], + fields: [{ + label: 'Value1', + value: function (row) { + return row.value1.toLocaleString(); + }, + stringify: false + }] + }, function (error, csv) { + t.error(error); + t.equal(csv, csvFixtures.functionNoStringify); + t.end(); + }); + }); + test('should parse JSON values with trailing backslashes', function (t) { json2csv({ data: jsonTrailingBackslash,