servicestack,C#,.net,Json,servicestack" /> servicestack,C#,.net,Json,servicestack" />

C# 文本是否提供了漂亮的JSON打印?

C# 文本是否提供了漂亮的JSON打印?,c#,.net,json,servicestack,C#,.net,Json,servicestack,TL;DR:ServiceStack.Text中是否有内置的方法来生成打印精美的JSON 我正在使用它进行JSON序列化。到目前为止,它工作得非常好,但是创建的JSON(使用.ToJSON())没有使用空格或换行符进行格式化(通过网络发送时最有可能节省空间)。然而,在某些情况下,最好将JSON格式化以便于人类阅读 .Dump()方法进行某种格式设置,但不会生成有效的JSON(即,缺少周围的双引号)。中的T.Dump()和T.PrintDump()扩展方法只是使用TypeSerializer类或T

TL;DR:ServiceStack.Text中是否有内置的方法来生成打印精美的JSON

我正在使用它进行JSON序列化。到目前为止,它工作得非常好,但是创建的JSON(使用
.ToJSON()
)没有使用空格或换行符进行格式化(通过网络发送时最有可能节省空间)。然而,在某些情况下,最好将JSON格式化以便于人类阅读

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

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


v4.5.5中提供的新的
string.IndentJson()
扩展方法将允许您漂亮地打印JSON,否则您可以为Chrome或Firefox安装漂亮的JSONView扩展以查看漂亮的JSON,或者您可以将JSON粘贴到中,从servicestack文本中获得漂亮的JSON格式会更好。作为一种变通方法,因为我创建了一个插件,在需要时格式化json。希望将来发布的service stack I可以删除此代码

从下面的链接下载dll(它为您提供了格式化json的扩展方法)

我用它来代替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调用示例服务#

要获得漂亮的JSON:

var formattedJson = JsvFormatter.Format(JsonSerializer.SerializeToString(dto));
生成的json字符串可以解析回:

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

Pitty,如果有漂亮的JSON打印,那就太好了。这不仅仅是在调试时自己查看数据,也就是在将JSON写入文件以进行持久存储时。当然,它是有用的——只是不会降低速度并污染核心路径。类似于
T.Dump()
的后期格式化过程更好。但这不是我需要的东西,所以对我来说不是优先考虑的——首先需要它的人首先实现它:)对于像配置文件这样的东西,能够在文本编辑器中读取文档是很有帮助的,对于加载配置文件来说,速度并不是什么大问题。jsv更适合配置文件,因为它更易于编写和读取。
var formattedJson = JsvFormatter.Format(JsonSerializer.SerializeToString(dto));
var dto = JsonSerializer.DeserializeFromString<MyDto>(formattedJson);