Предоставляет ли ServiceStack.Text довольно-печатную версию JSON?

TL; DR: Есть ли встроенный способ в ServiceStack.Text для создания довольно печатного JSON?

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

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

Ответ 1

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

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

Ответ 2

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

Скачайте 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());

Чтобы вызвать пример службы из С#

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

Вот эквивалентный xml one

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

Ответ 3

Чтобы получить красивый JSON:

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

Полученная строка json может быть проанализирована обратно:

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