diff --git a/src/Angular.js b/src/Angular.js index fc0b378369eb..5da082d28adc 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -964,12 +964,19 @@ function toJsonReplacer(key, value) { * stripped since angular uses this notation internally. * * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. - * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace. + * @param {boolean|number=} pretty If set to true, the JSON output will contain newlines and whitespace. + * If set to an integer, the JSON output will contain that many spaces per indentation (the default is 2). * @returns {string|undefined} JSON-ified string representing `obj`. */ function toJson(obj, pretty) { if (typeof obj === 'undefined') return undefined; - return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null); + if (typeof pretty !== "number") { + pretty = !!pretty; + } + if (pretty === true) { + pretty = 2; + } + return JSON.stringify(obj, toJsonReplacer, pretty); } diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index 1d42415c8916..9474918b8277 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -501,25 +501,31 @@ function dateFilter($locale) { * the binding is automatically converted to JSON. * * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. + * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. * @returns {string} JSON string. * * * @example -
{{ {'name':'value'} | json }}
+
{{ {'name':'value'} | json }}
+
{{ {'name':'value'} | json:4 }}
it('should jsonify filtered objects', function() { - expect(element(by.binding("{'name':'value'}")).getText()).toMatch(/\{\n "name": ?"value"\n}/); + expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); });
* */ function jsonFilter() { - return function(object) { - return toJson(object, true); + return function(object, spacing) { + if (isUndefined(spacing)) { + spacing = 2; + } + return toJson(object, spacing); }; } diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 4349fb2a656f..e63789100947 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -1191,9 +1191,17 @@ describe('angular', function() { it('should format objects pretty', function() { expect(toJson({a: 1, b: 2}, true)). - toBeOneOf('{\n "a": 1,\n "b": 2\n}', '{\n "a":1,\n "b":2\n}'); + toBe('{\n "a": 1,\n "b": 2\n}'); expect(toJson({a: {b: 2}}, true)). - toBeOneOf('{\n "a": {\n "b": 2\n }\n}', '{\n "a":{\n "b":2\n }\n}'); + toBe('{\n "a": {\n "b": 2\n }\n}'); + expect(toJson({a: 1, b: 2}, false)). + toBe('{"a":1,"b":2}'); + expect(toJson({a: 1, b: 2}, 0)). + toBe('{"a":1,"b":2}'); + expect(toJson({a: 1, b: 2}, 1)). + toBe('{\n "a": 1,\n "b": 2\n}'); + expect(toJson({a: 1, b: 2}, {})). + toBe('{\n "a": 1,\n "b": 2\n}'); }); diff --git a/test/ng/filter/filtersSpec.js b/test/ng/filter/filtersSpec.js index e5d56316388e..977055bf1b81 100644 --- a/test/ng/filter/filtersSpec.js +++ b/test/ng/filter/filtersSpec.js @@ -210,6 +210,9 @@ describe('filters', function() { it('should do basic filter', function() { expect(filter('json')({a:"b"})).toEqual(toJson({a:"b"}, true)); }); + it('should allow custom indentation', function() { + expect(filter('json')({a:"b"}, 4)).toEqual(toJson({a:"b"}, 4)); + }); }); describe('lowercase', function() {