Does ServiceStack.Text offer pretty-printing of JSON? Does ServiceStack.Text offer pretty-printing of JSON? json json

Does ServiceStack.Text offer pretty-printing of JSON?


The T.Dump() and T.PrintDump() extension methods in ServiceStack.Text are just a pretty formatted version of the JSV Format that's created with the TypeSerializer class or T.ToJsv() Extension method. It is only to provide a human friendly dump of data, it's not parseable.

The new string.IndentJson() extension method available from v4.5.5 will let you pretty-print JSON otherwise you can install a Pretty JSONView extension for Chrome or Firefox to see pretty JSON or you can paste the JSON in jsonprettyprint.com


Having a pretty json format would be good from the servicestack text. As a workaround because I created a a plugin to format the json when I needed it. Hopefully a future release of service stack I can get rid of this code.

Download the dll from the link below, (it gives you an extension method to format the json)http://www.markdavidrogers.com/json-pretty-printerbeautifier-library-for-net/

I used this in stead of something like json.net as I wanted to make sure I did not change the servicestack serialization of the json.

Then I created the following pluging

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using JsonPrettyPrinterPlus;using ServiceStack.Common.Web;using ServiceStack.ServiceClient.Web;using ServiceStack.ServiceHost;using ServiceStack.ServiceModel.Serialization;using ServiceStack.ServiceModel.Support;using ServiceStack.WebHost.Endpoints;namespace Bm.Services.Plugins{    public class PrettyJsonFormatPlugin : IPlugin    {        public const string JsonPrettyText = "application/prettyjson";        public void Register(IAppHost appHost)        {            appHost.ContentTypeFilters.Register(JsonPrettyText,                 Serialize,                 Deserialize);        }        public static void Serialize(IRequestContext requestContext, object dto, Stream outputStream)        {            var json = HttpResponseFilter.Instance.Serialize(ContentType.Json, dto);            json = json.PrettyPrintJson();            byte[] bytes = Encoding.UTF8.GetBytes(json);            outputStream.Write(bytes, 0, bytes.Length);        }        public static object Deserialize(Type type, Stream fromStream)        {            var obj = JsonDataContractDeserializer.Instance.DeserializeFromStream(type, fromStream);            return obj;        }    }    public class PrettyJsonServiceClient : JsonServiceClient    {        public PrettyJsonServiceClient() : base()        {        }        public PrettyJsonServiceClient(string baseUri) : base(baseUri)        {                   }        public PrettyJsonServiceClient(string syncReplyBaseUri, string asyncOneWayBaseUri) : base(syncReplyBaseUri, asyncOneWayBaseUri)        {        }        public override string Format        {            get            {                return "prettyjson";            }        }    }}

In you startup code register the new plugin

EndpointHost.AddPlugin(new PrettyJsonFormatPlugin());

To call an example service from c#

var prettyJsonClient = new PrettyJsonServiceClient(HOST_URL);var ret = prettyJsonClient.Get<string>(@"/system/ping/test");

Here is an equivilent xml one

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using Bm.Core;using JsonPrettyPrinterPlus;using ServiceStack.Common.Web;using ServiceStack.ServiceClient.Web;using ServiceStack.ServiceHost;using ServiceStack.ServiceModel.Serialization;using ServiceStack.ServiceModel.Support;using ServiceStack.WebHost.Endpoints;namespace Bm.Services.Plugins{    public class PrettyXmlFormatPlugin : IPlugin    {    public const string XmlPrettyText = "application/prettyxml";    public void Register(IAppHost appHost)    {        appHost.ContentTypeFilters.Register(XmlPrettyText,         Serialize,         Deserialize);    }    public static void Serialize(IRequestContext requestContext, object dto, Stream outputStream)    {        var xml = HttpResponseFilter.Instance.Serialize(ContentType.Xml, dto);        xml =  Common.PrettyXml(xml);        byte[] bytes = Encoding.UTF8.GetBytes(xml);        outputStream.Write(bytes, 0, bytes.Length);    }    public static object Deserialize(Type type, Stream fromStream)    {        var obj = JsonDataContractDeserializer.Instance.DeserializeFromStream(type, fromStream);        return obj;    }    }    public class PrettyXmlServiceClient : XmlServiceClient    {    public PrettyXmlServiceClient()        : base()    {    }    public PrettyXmlServiceClient(string baseUri)        : base(baseUri)    {    }    public PrettyXmlServiceClient(string syncReplyBaseUri, string asyncOneWayBaseUri)        : base(syncReplyBaseUri, asyncOneWayBaseUri)    {    }    public override string Format    {        get        {        return "prettyxml";        }    }    }}


To get pretty JSON:

var formattedJson = JsvFormatter.Format(JsonSerializer.SerializeToString(dto));

The resulting json string can be parsed back:

var dto = JsonSerializer.DeserializeFromString<MyDto>(formattedJson);