Не ServiceStack.Текстовое предложение pretty-printing JSON?

TL; DR: есть ли встроенный способ в ServiceStack.Текст для создания pretty-printed JSON?

Я использую ServiceStack.Текст для выполнения сериализации JSON. До сих пор он работает очень хорошо, но созданный JSON (используя .ToJSON()) не формируется с пробелами или новыми строками (скорее всего, для экономии места при отправке по сети). Однако в некоторых случаях было бы неплохо отформатировать JSON для удобства чтения человеком.

на .Dump () метод выполняет какое-то форматирование, однако не создает допустимый JSON (т. е. окружающие doublequotes отсутствуют).

3 ответов


на T.Dump() и T.PrintDump() методы расширения в ServiceStack.Текст это просто довольно форматированная версия формат JSV это создано с помощью класса TypeSerializer или T.ToJsv() метод расширения. Это только для обеспечения дружественного к человеку дампа данных, он не поддается анализу.

новая string.IndentJson() метод расширения, доступный из v4.5.5 позволит вам pretty-print JSON в противном случае вы можете установить довольно расширение JSONView для Chrome или Firefox, чтобы увидеть довольно JSON или вы можете вставить JSON вjsonprettyprint.com


имея довольно формат json было бы хорошо из текста servicestack. В качестве обходного пути, потому что я создал плагин для форматирования json, когда мне это было нужно. Надеюсь, в будущем выпуске Service stack я смогу избавиться от этого кода.

загрузите dll по ссылке ниже (это дает вам метод расширения для форматирования json) http://www.markdavidrogers.com/json-pretty-printerbeautifier-library-for-net/

я использовал это вместо чего-то вроде json.net поскольку я хотел убедиться, что я не изменил сериализацию servicestack 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");

вот equivilent 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);