2012-12-06 32 views
14

TL; DR: Có cách tích hợp trong ServiceStack.Text để tạo JSON được in đẹp không?ServiceStack.Text có cung cấp khá in ấn JSON không?

Tôi đang sử dụng ServiceStack.Text để thực hiện tuần tự hóa JSON. Nó hoạt động thực sự tốt cho đến nay, nhưng JSON được tạo ra (sử dụng .ToJSON()) không được tạo bằng các khoảng trống hoặc các dòng mới (hầu hết có khả năng tiết kiệm không gian khi gửi qua mạng). Tuy nhiên, trong một số trường hợp, sẽ tốt hơn nếu định dạng JSON để dễ đọc hơn.

Phương thức .Dump() thực hiện một số loại định dạng, tuy nhiên không tạo JSON hợp lệ (nghĩa là các dấu ngoặc kép xung quanh bị thiếu).

Trả lời

8

Các T.Dump()T.PrintDump() phương pháp khuyến nông trong ServiceStack.Text chỉ là một phiên bản khá được định dạng của JSV Format đó là tạo ra với các lớp TypeSerializer hoặc T.ToJsv() phương pháp mở rộng. Nó chỉ là để cung cấp một bãi chứa dữ liệu thân thiện với con người, nó không thể phân tích cú pháp.

Phương pháp string.IndentJson() mở rộng mới có sẵn từ v4.5.5 sẽ cho phép bạn khá-in JSON nếu không bạn có thể cài đặt một phần mở rộng JSONView Khá dành cho Chrome hoặc Firefox để xem JSON khá hay bạn có thể dán JSON trong jsonprettyprint.com

+2

Pitty, sẽ thực sự tuyệt vời để có in khá cho JSON. Nó không chỉ là về việc tự xem dữ liệu khi gỡ lỗi, nhưng tức là khi viết JSON vào các tệp để lưu trữ liên tục. – Dyna

+0

Chắc chắn, nó có thể hữu ích - không phải lúc chi phí làm chậm và gây ô nhiễm đường dẫn cốt lõi. Một quá trình định dạng bài viết hoạt động như 'T.Dump()' là tốt hơn. Nhưng không phải thứ tôi cần để ưu tiên cho tôi - đầu tiên cần nó để thực hiện nó trước :) – mythz

+3

Đối với một cái gì đó giống như một tệp cấu hình, có thể đọc tài liệu trong trình soạn thảo văn bản là hữu ích, và tốc độ là không thực sự là một vấn đề lớn khi tải một tập tin cấu hình. –

2

Có một định dạng json đẹp sẽ là tốt từ văn bản servicestack. Như một giải pháp thay thế vì tôi đã tạo một plugin để định dạng json khi tôi cần nó. Hy vọng rằng một bản phát hành dịch vụ ngăn xếp trong tương lai tôi có thể loại bỏ mã này.

Tải dll từ liên kết dưới đây, (nó mang lại cho bạn một phương pháp mở rộng để định dạng json) http://www.markdavidrogers.com/json-pretty-printerbeautifier-library-for-net/

Tôi sử dụng này thay cho cái gì đó như json.net như tôi muốn chắc chắn rằng tôi đã không thay đổi tuần tự hóa servicestack của json.

Sau đó, tôi đã tạo ra sau 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"; 
      } 
     } 
    } 
} 

Trong bạn mã khởi động đăng ký các plugin mới

EndpointHost.AddPlugin(new PrettyJsonFormatPlugin()); 

Để gọi một dịch vụ ví dụ từ C#

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

Dưới đây là một 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

Để có được JSON khá:

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

Kết quả là chuỗi json thể được phân tích lại:

var dto = JsonSerializer.DeserializeFromString<MyDto>(formattedJson); 
Các vấn đề liên quan