2012-12-06 20 views
14

TL; DR:在ServiceStack.Text中是否有內置的方法來生成漂亮的JSON?ServiceStack.Text是否提供JSON的漂亮打印?

我正在使用ServiceStack.Text做JSON序列化。它迄今爲止效果非常好,但創建的JSON(使用.ToJSON())沒有用空格或換行符格式化(最有可能通過網絡發送時節省空間)。但是,在某些情況下,將JSON格式化爲更易於閱讀的人員會很好。

.Dump()方法執行某種格式化,但不會生成有效的JSON(即周圍的雙引號缺失)。

回答

8

ServiceStack.TextT.Dump()T.PrintDump()擴展方法只是一個與該TypeSerializer類或T.ToJsv()擴展方法創建的JSV Format一個漂亮的格式化版本。它只是提供一個人性化的數據轉儲,它不能被解析。

string.IndentJson()擴展可從v4.5.5方法會讓你漂亮打印JSON否則,你可以安裝一個漂亮的JSONView擴展Chrome或Firefox看到漂亮的JSON,也可以粘貼在JSON jsonprettyprint.com

+2

皮蒂,將是真正偉大的,有漂亮的印刷的JSON。它不僅僅是在調試時自己查看數據,而是在將JSON寫入文件以進行持久性存儲時。 – Dyna

+0

當然,它可能是有用的 - 只是不以放慢和污染核心路徑爲代價。像'T.Dump()'一樣工作的後期格式化過程更好。但不是我所需要的東西,所以對我來說不是一個優先事項 - 第一個需要它的人會首先實現它:) – mythz

+3

對於像配置文件這樣的東西,能夠在文本編輯器中讀取文檔是有幫助的,並且速度isn加載配置文件並不是一個大問題。 –

2

有一個漂亮的json格式在servicestack文本中是很好的。作爲一種解決方法,因爲我創建了一個插件來在需要時格式化json。希望將來的服務堆棧版本可以擺脫這種代碼。

下載從下面的鏈接的dll,(它爲您提供了一個擴展方法格式化JSON) http://www.markdavidrogers.com/json-pretty-printerbeautifier-library-for-net/

我用這東西代替像json.net,因爲我想確保我沒有改變json的servicestack序列化。

然後,我創建了以下pluging

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

變得相當JSON:

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

產生的JSON字符串可以解析回:

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