ServiceStack.Text是否提供JSON的漂亮打印?

TL; DR:ServiceStack.Text中是否有内置方式来生成漂亮的JSON?

我正在使用ServiceStack.Text来进行JSON序列化。 到目前为止它确实很好用,但是创建的JSON(使用.ToJSON() )没有用空格或换行符格式化(最有可能在通过网络发送时节省空间)。 但是,在某些情况下,将JSON格式化以便于人类可读性会更好。

.Dump ()方法执行某种格式化,但不会生成有效的JSON(即缺少周围的双引号)。

ServiceStack.Text中的T.Dump()T.PrintDump()扩展方法只是使用TypeSerializer类或T.ToJsv() Extension方法创建的JSV格式的相当格式化的版本。 它只是提供一个人性化的数据转储,它不是可解析的。

string.IndentJson()提供的新string.IndentJson()扩展方法可以让你精美打印JSON,否则你可以为Chrome或Firefox安装一个Pretty JSONView扩展来查看漂亮的JSON,或者你可以将jSON粘贴到jsonprettyprint.com

从servicestack文本中获得漂亮的json格式会很好。 作为一种解决方法,因为我在需要时创建了一个用于格式化json的插件。 希望将来发布的服务堆栈我可以摆脱这段代码。

从下面的链接下载dll(它为您提供了一种格式化json的扩展方法) http://www.markdavidrogers.com/json-pretty-printerbeautifier-library-for-net/

我使用它而不是像json.net这样的东西,因为我想确保我没有更改json的servicestack序列化。

然后我创建了以下插件

 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"; } } } } 

在您启动代码注册新插件

 EndpointHost.AddPlugin(new PrettyJsonFormatPlugin()); 

从c#调用示例服务

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

这是一个等效的xml

 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"; } } } } 

获得漂亮的JSON:

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

生成的json字符串可以解析回来:

 var dto = JsonSerializer.DeserializeFromString(formattedJson);