JavaScriptSerializer를 사용하여 개체를 파일에 JSON 형식으로 serialize합니다. 그러나 결과 파일에는 읽을 수있는 형식이 없습니다. 포맷팅을 통해 읽을 수있는 파일을 얻는 방법은 무엇입니까?JSON을 직렬화 할 때 JavaScriptSerializer로 서식을 설정하는 방법은 무엇입니까?
답변
JSON-serializer의 출력 형식을 지정하는 도구가 내장되어 있지 않은 것 같습니다.
이 문제가 발생한 이유는 네트워크를 통해 전송되는 데이터를 최소화하는 것입니다.
포맷 된 데이터가 코드에 필요합니까? 또는 디버깅하는 동안 JSON을 분석하고 싶습니까?
이러한 기능을 제공하는 많은 온라인 서비스가 있습니다 : 1, 2. 또는 독립 실행 형 응용 프로그램 : JSON viewer.
그러나 애플리케이션 내부에서 서식을 지정해야하는 경우 직접 appropriate code을 작성할 수 있습니다. 당신은 JSON.NET 시리얼 라이저를 사용할 수
, 그것은 NuGet을 통해 this package을 다운로드 할 수 있습니다 JSON 형식
string body = JsonConvert.SerializeObject(message, Formatting.Indented);
저쪽을 지원합니다.
여기 내 솔루션은 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();
}
}
왜 'IDisposable'을 사용해야합니까? 그냥'Process'를 정적 메소드로 만드는 것이 어떻겠습니까? – tenfour
@tenfour - 너는 옳은 사람이야. 이 코드 스 니펫은 스택 오버 플로우를 위해 단순화 된 더 큰 블록에서 가져온 것입니다. –
그것은 모두를위한 해결책이 아닙니다! 프로젝트가 .NET 4이거나 프로젝트가 웹 지정이 아니면 페이지 이미지 (또는 형식) 충돌이 발생합니다! System.Web.Script.Serialization을 가져 오려면 System.Web.Extensions (.NET4.5 필요!)를 사용하고 있습니다. 구체적인 솔루션을 얻으려면 NuGet을 사용하여 Newtonsoft를 획득하고 JsonConvert.SerializeObject를 사용해야합니다. –
입니다. 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();
}
- 1. JSON을 데이터베이스로 직렬화 및 비 직렬화
- 2. JSON을 사용하여 객체 직렬화 및 역 직렬화
- 3. JSON을 LINQ 객체에 비 직렬화
- 4. 역 직렬화 할 때 유형을 파악하는 방법은 무엇입니까?
- 5. 문자열에 서식을 포함시키는 방법은 무엇입니까?
- 6. 브라우저는 컨트롤러에서 JSON을 반환 할 때
- 7. ASP.NET MVC3에서 JavaScriptSerializer로 이스케이프 인용하기
- 8. 레일로 내보내기 할 때 서식을 추가하는 방법
- 9. 서식을 다시 형성하는 방법은 무엇입니까?
- 10. to_xml을 직렬화 할 때 NoMethodError
- 11. 저장 파일을 읽을 때 텍스트 서식을 관리하는 방법은 무엇입니까?
- 12. JQuery를 사용하여 MVC에서 JSON을 deserialize하는 방법은 무엇입니까?
- 13. 누군가를 로깅 할 때 세션 변수를 안전하게 설정하는 방법은 무엇입니까?
- 14. 템플릿을 적용 할 때 datatemplate 멤버의 가시성을 설정하는 방법은 무엇입니까?
- 15. javax.tools.JavaCompiler 소스를 컴파일 할 때 classpath를 설정하는 방법은 무엇입니까?
- 16. 페이지를 다시로드 할 때 .click jquery 변수를 설정하는 방법은 무엇입니까?
- 17. 글꼴을 인스턴스화 할 때 여러 FontStyles를 설정하는 방법은 무엇입니까?
- 18. 작업을 다시 추가 할 때 만료 시간을 설정하는 방법은 무엇입니까?
- 19. PHP로 JSON을 압축하는 방법은 무엇입니까?
- 20. JSON.NET을 사용하여 일부 JSON을 비 직렬화
- 21. STL 스트림을 사용할 때 내 개체의 서식을 지정하는 방법은 무엇입니까?
- 22. Lift-JSON을 통해 json 객체 직렬화 및 비 직렬화
- 23. navigationItem에 backgroundColor를 설정하는 방법은 무엇입니까?
- 24. Smarty로 json을 생성하는 방법은 무엇입니까?
- 25. ASP에서 JSON을 압축하는 방법은 무엇입니까?
- 26. 소수점을 올바르게 반올림하고 서식을 지정하는 방법은 무엇입니까?
- 27. WPF 컨트롤을 직렬화 할 때 예외가 발생했습니다.
- 28. 인쇄 페이지 서식을 설정하는 방법은 화면 페이지와 다릅니다?
- 29. 서식을 완료 할 때 많은 옵션 중에서 선택하는 방법
- 30. WinForms RichTextBox : TextChanged에서 서식을 지정하는 방법은 무엇입니까?
당신은 원하는 서식을 설정 JsonConvert.SerializeObject (메시지, Newtonsoft.Json.Formatting.Indented, 새를 설정할 수 있습니다 JsonSerializerSettings {ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()}); –