C# 如何美化JSON以在文本框中显示?
如何使用C#美化JSON?我想在文本框控件中打印结果 可以使用JavaScriptSerializer吗,还是应该使用JSON.net?除非我必须这样做,否则我希望避免对字符串进行反序列化。使用,您可以使用特定的格式美化输出 网上小提琴 代码 输出C# 如何美化JSON以在文本框中显示?,c#,json,C#,Json,如何使用C#美化JSON?我想在文本框控件中打印结果 可以使用JavaScriptSerializer吗,还是应该使用JSON.net?除非我必须这样做,否则我希望避免对字符串进行反序列化。使用,您可以使用特定的格式美化输出 网上小提琴 代码 输出 {"Name":"Apple","Expiry":"2008-12-28T00:00:00","Sizes":["Small"]} { "Name": "Apple", "Expiry": "2008-12-28T00:00:00", "
{"Name":"Apple","Expiry":"2008-12-28T00:00:00","Sizes":["Small"]}
{
"Name": "Apple",
"Expiry": "2008-12-28T00:00:00",
"Sizes": [
"Small"
]
}
这次聚会有点晚,但您可以美化(或缩小)Json,而无需使用Json.NET进行反序列化:
JToken-parsedJson=JToken.Parse(jsonString);
var美化=parsedJson.ToString(格式化.缩进);
var minified=parsedJson.ToString(Formatting.None);
编辑:继关于性能的评论中的讨论之后,我测量了使用,并且使用
JToken.Parse
,存在额外的分配成本,并且花费的时间略有增加:
应将ContractResolver.cs序列化
public class ShouldSerializeContractResolver : DefaultContractResolver
{
public static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
return property;
}
}
您可以使用上述代码美化json您可以在不使用新System.Text.json命名空间反序列化的情况下处理json,以避免添加对json.NET的依赖。诚然,这并不像以下那样简洁:
你是说用换行符和缩进格式化?这可能是重复的吗?是否要格式化JSON代码,使其看起来美观易读?但是格式化JSON代码与反序列化有什么关系呢?是的,我说的是美化、换行、缩进。我不想/需要反序列化任何东西,我只是觉得如果我使用JSON.Net,我必须反序列化=>序列化才能有一个漂亮的JSON输出。我想这没有被接受为答案的原因是,使用此方法美化JSON需要在重新序列化之前先反序列化?@Jimbo确实如此。我会找一个替代方案。在解析创建JToken时,您也可以查找stuartd,是不是创建了动态对象?@aloisdg可能是的。我必须检查性能问题。我不确定我们是否能在这方面获胜。有人说“读写JSON的绝对最快的方法是使用JsonTextReader/JsonTextWriter直接手动序列化类型”,但对于大多数涉及格式化JSON的用例来说,这是不必要的。这是不完整的,请说明什么是
ShouldSerializeContractResolver
。您可以再次看到上面的linkcheck评论
public class ShouldSerializeContractResolver : DefaultContractResolver
{
public static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
return property;
}
}
var beautifyJson= Newtonsoft.Json.JsonConvert.SerializeObject(data, new JsonSerializerSettings()
{
ContractResolver = ShouldSerializeContractResolver.Instance,
NullValueHandling = NullValueHandling.Ignore,
Formatting = Formatting.Indented
});
using System.IO;
using System.Text;
using System.Text.Json;
public static string BeautifyJson(string json)
{
using JsonDocument document = JsonDocument.Parse(json);
using var stream = new MemoryStream();
using var writer = new Utf8JsonWriter(stream, new JsonWriterOptions() { Indented = true });
document.WriteTo(writer);
writer.Flush();
return Encoding.UTF8.GetString(stream.ToArray());
}