2011-05-04 6 views

Trả lời

10

Dường như không có công cụ tích hợp để định dạng đầu ra của bộ nối tiếp JSON.
Tôi cho rằng lý do tại sao điều này xảy ra là giảm thiểu dữ liệu mà chúng tôi gửi qua mạng.

Bạn có chắc chắn rằng mình cần dữ liệu được định dạng trong mã không? Hoặc bạn muốn analize JSON chỉ trong quá trình gỡ lỗi?

Có rất nhiều dịch vụ trực tuyến cung cấp chức năng như vậy: 1, 2. Hoặc ứng dụng độc lập: JSON viewer.

Nhưng nếu bạn cần định dạng bên trong ứng dụng, bạn có thể tự viết appropriate code.

31

Bạn có thể sử dụng JSON.NET serializer, nó hỗ trợ JSON định dạng

string body = JsonConvert.SerializeObject(message, Formatting.Indented); 

Yon có thể tải this package qua NuGet.

+0

Bạn thậm chí có thể thiết lập các thiết lập định dạng mong muốn JsonConvert.SerializeObject (tin nhắn, Newtonsoft.Json.Formatting.Indented, mới JsonSerializerSettings {ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()}); –

16

Đây là giải pháp của tôi không yêu cầu sử dụng JSON.NET và đơn giản hơn mã được liên kết bởi Alex Zhevzhik.

using System.Web.Script.Serialization; 
    // add a reference to System.Web.Extensions 


    public void WriteToFile(string path) 
    { 
     var serializer  = new JavaScriptSerializer(); 
     string json  = serializer.Serialize(this); 
     string json_pretty = JSON_PrettyPrinter.Process(json); 
     File.WriteAllText(path, json_pretty); 
    } 

và đây là định dạng

class JSON_PrettyPrinter 
{ 
    public static string Process(string inputText) 
    { 
     bool escaped = false; 
     bool inquotes = false; 
     int column = 0; 
     int indentation = 0; 
     Stack<int> indentations = new Stack<int>(); 
     int TABBING = 8; 
     StringBuilder sb = new StringBuilder(); 
     foreach (char x in inputText) 
     { 
      sb.Append(x); 
      column++; 
      if (escaped) 
      { 
       escaped = false; 
      } 
      else 
      { 
       if (x == '\\') 
       { 
        escaped = true; 
       } 
       else if (x == '\"') 
       { 
        inquotes = !inquotes; 
       } 
       else if (!inquotes) 
       { 
        if (x == ',') 
        { 
         // if we see a comma, go to next line, and indent to the same depth 
         sb.Append("\r\n"); 
         column = 0; 
         for (int i = 0; i < indentation; i++) 
         { 
          sb.Append(" "); 
          column++; 
         } 
        } else if (x == '[' || x== '{') { 
         // if we open a bracket or brace, indent further (push on stack) 
         indentations.Push(indentation); 
         indentation = column; 
        } 
        else if (x == ']' || x == '}') 
        { 
         // if we close a bracket or brace, undo one level of indent (pop) 
         indentation = indentations.Pop(); 
        } 
        else if (x == ':') 
        { 
         // if we see a colon, add spaces until we get to the next 
         // tab stop, but without using tab characters! 
         while ((column % TABBING) != 0) 
         { 
          sb.Append(' '); 
          column++; 
         } 
        } 
       } 
      } 
     } 
     return sb.ToString(); 
    } 

} 
+0

Tại sao nên sử dụng 'IDisposable'? Tại sao không chỉ làm cho 'Xử lý' một phương thức tĩnh? – tenfour

+0

@tenfour - bạn hoàn toàn chính xác. Đoạn mã này đến từ một khối lớn hơn đã được đơn giản hóa cho stackoverflow ... Tôi sẽ đơn giản hóa nó hơn nữa. –

+0

Nó không phải là một giải pháp cho tất cả mọi người! Bạn sẽ có xung đột hình ảnh (hoặc định dạng) trang nếu dự án của bạn là .NET 4 hoặc nếu dự án của bạn không phải là một chỉ định web! Lưu ý rằng bạn đang sử dụng System.Web.Extensions (cần .NET4.5!) Để đưa vào System.Web.Script.Serialization !! Đối với một giải pháp cụ thể, bạn nên sử dụng NuGet để có được Newtonsoft và sử dụng JsonConvert.SerializeObject –

5

Tôi cũng muốn để có thể đã được định dạng JSON mà không dựa vào một thành phần của bên thứ ba. Giải pháp của Mark Lakata hoạt động tốt (nhờ Mark), nhưng tôi muốn các dấu ngoặc đơn và tabbing giống như trong liên kết của Alex Zhevzhik. Vì vậy, đây là một phiên bản tinh chỉnh mã của Mark mà làm việc theo cách đó, trong trường hợp bất cứ ai khác muốn nó:

/// <summary> 
/// Adds indentation and line breaks to output of JavaScriptSerializer 
/// </summary> 
public static string FormatOutput(string jsonString) 
{ 
    var stringBuilder = new StringBuilder(); 

    bool escaping = false; 
    bool inQuotes = false; 
    int indentation = 0; 

    foreach (char character in jsonString) 
    { 
     if (escaping) 
     { 
      escaping = false; 
      stringBuilder.Append(character); 
     } 
     else 
     { 
      if (character == '\\') 
      { 
       escaping = true; 
       stringBuilder.Append(character); 
      } 
      else if (character == '\"') 
      { 
       inQuotes = !inQuotes; 
       stringBuilder.Append(character); 
      } 
      else if (!inQuotes) 
      { 
       if (character == ',') 
       { 
        stringBuilder.Append(character); 
        stringBuilder.Append("\r\n"); 
        stringBuilder.Append('\t', indentation); 
       } 
       else if (character == '[' || character == '{') 
       { 
        stringBuilder.Append(character); 
        stringBuilder.Append("\r\n"); 
        stringBuilder.Append('\t', ++indentation); 
       } 
       else if (character == ']' || character == '}') 
       { 
        stringBuilder.Append("\r\n"); 
        stringBuilder.Append('\t', --indentation); 
        stringBuilder.Append(character); 
       } 
       else if (character == ':') 
       { 
        stringBuilder.Append(character); 
        stringBuilder.Append('\t'); 
       } 
       else 
       { 
        stringBuilder.Append(character); 
       } 
      } 
      else 
      { 
       stringBuilder.Append(character); 
      } 
     } 
    } 

    return stringBuilder.ToString(); 
}