59

How can I use this json pretty print [ http://jsfiddle.net/KJQ9K/ ] with angularJS?

Lets assume myJsonValue is

{a:1, 'b':'foo', c:[false,'false',null, 'null', {d:{e:1.3e5,f:'1.3e5'}}]}

I want to be able to use below to render pre (as shown in example)

4 Answers 4

130

Angular already has the json filter built-in:

<pre>
  {{data | json}}
</pre>

The json after the pipe | is an Angular Filter. You can make your own custom filter if you like:

app.filter('prettyJSON', function () {
    function prettyPrintJson(json) {
      return JSON ? JSON.stringify(json, null, '  ') : 'your browser doesnt support JSON so cant pretty print';
    }
    return prettyPrintJson;
});

To use your custom prettyJSON filter:

  <pre>
    {{data | prettyJSON}}
  </pre>

ES6 version from @TeChn4K:

app.filter("prettyJSON", () => json => JSON.stringify(json, null, " "))
Sign up to request clarification or add additional context in comments.

2 Comments

Best answer. One line with the es6 syntax : app.filter("prettyJSON", () => json => JSON.stringify(json, null, " "))
For my structure it throws TypeError: Converting circular structure to JSON. I guess that's a separate issue
19

Another option is to turn the function into a filter...

app.filter('prettify', function () {

    function syntaxHighlight(json) {
        // ...
    }

    return syntaxHighlight;
});

HTML...

<pre ng-bind-html="json | prettify"></pre>

JsFiddle: http://jsfiddle.net/KSTe8/

4 Comments

Worked but I'm seeing below error message now; "Error: json is undefined syntaxHighlight@dev.redrum.us/scripts/app.js:25 Xa.prototype.filter/e@ajax.googleapis.com/ajax/libs/angularjs/1.2.7/…........."
See below for a simpler answer. The JSON object isn't in all browsers, so that's probably why it's failing. There is a json.js shim out there somewhere.
Perfect solution!
9

A simpler code:

app.filter('prettyJSON', function () {
    return function(json) { return angular.toJson(json, true); }
});

Remember to use the <pre> tag

Comments

0

You have a few options. What I consider the most "AngularJS" way is to wrap your custom object into an Angular service:

myAngularModule.service('myPrettyPrintService', ,myObject );

The inject that into a controller:

myAngularModule.controller('myTestController', function(myPrettyPrintService){}

Then inside the controller, reference the functions and sort:

myPrettyPrintService.syntaxHighlight();

Since anything defined in JavaScript, is global anyway you could technically just access it inside a controller:

syntaxHighlight();

That may screw up with unit testingt because it adds a external, undefined, dependency to your controller.

2 Comments

Hey, I don't think a service is the best way here. For presentation, a filter is more appropriate.
@MichaelCole That approach is documented fairly well in a few other answers; I have no other comment on it, though.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.