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

14

TL;DR: 在ServiceStack.Text中有内置的方法可以产生漂亮的JSON格式吗?

我正在使用 ServiceStack.Text 进行JSON序列化,它的功能非常好,但是使用.ToJSON()生成的JSON没有空格或换行符(可能是为了在发送到网络时节省空间)。 然而,在某些情况下,更好的人类可读性需要对JSON进行格式化。

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

3个回答

10
ServiceStack.Text中,T.Dump()T.PrintDump()扩展方法只是使用TypeSerializer类或T.ToJsv()扩展方法创建的JSV格式的漂亮格式化版本。它只提供了一种人性化的数据转储方式,无法解析。
从v4.5.5开始,新的string.IndentJson()扩展方法可以让您漂亮地打印JSON,否则您可以在Chrome或Firefox中安装Pretty JSONView扩展程序以查看漂亮的JSON,或者将JSON粘贴到jsonprettyprint.com中。

2
很遗憾,为JSON提供漂亮的打印功能将非常棒。这不仅仅是在调试时查看数据,而且还包括将JSON写入文件以进行持久存储。 - Dynalon
当然,它可能很有用——只是不能以减缓和污染核心路径为代价。像 T.Dump() 一样工作的帖子格式化处理过程会更好。但我不需要这样的东西,所以对我来说不是优先事项——首先需要它的人将首先实现它 :) - mythz
3
对于像配置文件这样的东西,能够在文本编辑器中阅读文档非常有帮助,而加载配置文件的速度并不是一个很大的问题。 - Richard Collette
jsv 对于配置文件来说更好,因为它更容易编写和阅读。 - unreal

2
为了获得漂亮的JSON格式:
var formattedJson = JsvFormatter.Format(JsonSerializer.SerializeToString(dto));

生成的 JSON 字符串可以被解析回来:
var dto = JsonSerializer.DeserializeFromString<MyDto>(formattedJson);

2
从ServiceStack文本中得到一个漂亮的JSON格式是很好的事情。由于这个原因,当我需要时,我创建了一个插件来格式化JSON。希望在将来的ServiceStack版本中,我可以摆脱这段代码。
从下面的链接下载DLL文件(它提供了一种扩展方法来格式化JSON): http://www.markdavidrogers.com/json-pretty-printerbeautifier-library-for-net/ 我使用了这个工具,而不是像Json.net这样的工具,因为我想确保我没有改变服务堆栈对JSON的序列化方式。
然后我创建了以下插件。
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";
        }
    }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接