14

TL; DR:ServiceStack.Textには、きれいに印刷されたJSONを生成するための組み込みの方法がありますか?

JSONシリアル化を行うためにServiceStack.Textを使用しています。これまでのところ非常にうまく機能していますが、作成されたJSON(を使用.ToJSON())は空白や改行でフォーマットされていません(ネットワーク経由で送信するときにスペースを節約する可能性が最も高いです)。ただし、状況によっては、人間が読みやすいようにJSONをフォーマットしておくと便利です。

この.Dump ()メソッドはある種のフォーマットを実行しますが、有効なJSONを生成しません(つまり、周囲の二重引用符が欠落しています)。

4

3 に答える 3

9

ServiceStack.TextT.Dump()およびT.PrintDump()extensionメソッドは、TypeSerializerクラスまたはExtensionメソッドで作成されたJSVフォーマットのかなりフォーマットされたバージョンです。人間に優しいデータのダンプを提供するだけであり、解析することはできません。T.ToJsv()

string.IndentJson()v4.5.5から利用できる新しい拡張メソッドを使用すると、JSONをきれいに印刷できます。それ以外の場合は、ChromeまたはFirefox用のPretty JSONView拡張機能をインストールして、きれいなJSONを表示するか、 jsonprettyprint.comにJSONを貼り付けることができます。

于 2012-12-07T04:51:18.533 に答える
2

きれいな JSON を取得するには:

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

結果の json 文字列は、解析して戻すことができます。

var dto = JsonSerializer.DeserializeFromString<MyDto>(formattedJson);
于 2016-10-28T18:00:13.617 に答える
2

サービススタックのテキストから、きれいなjson形式を持つことは良いことです。回避策として、必要なときに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());

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";
        }
    }
    }
}
于 2013-04-22T10:45:14.877 に答える