TL;DR:ServiceStack.Text 中是否有内置方式来生成打印精美的 JSON?
我正在使用ServiceStack.Text进行 JSON 序列化。到目前为止它工作得非常好,但是创建的 JSON(使用.ToJSON()
)不是用空格或换行符格式化的(通过网络发送时最有可能节省空间)。但是,在某些情况下,最好将 JSON 格式化为更易于人类阅读。
该.Dump ()
方法会进行某种格式设置,但不会生成有效的 JSON(即缺少周围的双引号)。
TL;DR:ServiceStack.Text 中是否有内置方式来生成打印精美的 JSON?
我正在使用ServiceStack.Text进行 JSON 序列化。到目前为止它工作得非常好,但是创建的 JSON(使用.ToJSON()
)不是用空格或换行符格式化的(通过网络发送时最有可能节省空间)。但是,在某些情况下,最好将 JSON 格式化为更易于人类阅读。
该.Dump ()
方法会进行某种格式设置,但不会生成有效的 JSON(即缺少周围的双引号)。
ServiceStack.Text中的T.Dump()
和T.PrintDump()
扩展方法只是使用 TypeSerializer 类或扩展方法创建的JSV 格式的格式化版本。它只是提供人类友好的数据转储,它是不可解析的。T.ToJsv()
v4.5.5 提供的新string.IndentJson()
扩展方法可以让您漂亮地打印 JSON,否则您可以为 Chrome 或 Firefox 安装漂亮的 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<string>(@"/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<MyDto>(formattedJson);