サービススタックのテキストから、きれいな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";
}
}
}
}