2011-05-04 2 views

답변

10

JSON-serializer의 출력 형식을 지정하는 도구가 내장되어 있지 않은 것 같습니다.
이 문제가 발생한 이유는 네트워크를 통해 전송되는 데이터를 최소화하는 것입니다.

포맷 된 데이터가 코드에 필요합니까? 또는 디버깅하는 동안 JSON을 분석하고 싶습니까?

이러한 기능을 제공하는 많은 온라인 서비스가 있습니다 : 1, 2. 또는 독립 실행 형 응용 프로그램 : JSON viewer.

그러나 애플리케이션 내부에서 서식을 지정해야하는 경우 직접 appropriate code을 작성할 수 있습니다. 당신은 JSON.NET 시리얼 라이저를 사용할 수

31

, 그것은 NuGet을 통해 this package을 다운로드 할 수 있습니다 JSON 형식

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

저쪽을 지원합니다.

+0

당신은 원하는 서식을 설정 JsonConvert.SerializeObject (메시지, Newtonsoft.Json.Formatting.Indented, 새를 설정할 수 있습니다 JsonSerializerSettings {ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()}); –

16

여기 내 솔루션은 JSON.NET을 사용할 필요가 없으며 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); 
    } 

내가 또한 타사 구성 요소에 의존하지 않고 JSON 포맷 가질 수 있기를 원 포맷터

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

왜 'IDisposable'을 사용해야합니까? 그냥'Process'를 정적 메소드로 만드는 것이 어떻겠습니까? – tenfour

+0

@tenfour - 너는 옳은 사람이야. 이 코드 스 니펫은 스택 오버 플로우를 위해 단순화 된 더 큰 블록에서 가져온 것입니다. –

+0

그것은 모두를위한 해결책이 아닙니다! 프로젝트가 .NET 4이거나 프로젝트가 웹 지정이 아니면 페이지 이미지 (또는 형식) 충돌이 발생합니다! System.Web.Script.Serialization을 가져 오려면 System.Web.Extensions (.NET4.5 필요!)를 사용하고 있습니다. 구체적인 솔루션을 얻으려면 NuGet을 사용하여 Newtonsoft를 획득하고 JsonConvert.SerializeObject를 사용해야합니다. –

5

입니다. Mark Lakata의 솔루션은 훌륭하게 작동했습니다 (Mark에게 감사드립니다). 그러나 Alex Zhevzhik의 링크에있는 괄호와 탭이 필요했습니다. 그래서 여기 경우 다른 사람이 그것을 원에, 그런 식으로 작동 마크 코드의 불통 버전입니다 :

/// <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(); 
} 
관련 문제