如何美化 JSON 以在 TextBox 中显示?
Posted
技术标签:
【中文标题】如何美化 JSON 以在 TextBox 中显示?【英文标题】:How can I beautify JSON for display in a TextBox? 【发布时间】:2011-09-04 22:23:02 【问题描述】:如何使用 C# 美化 JSON?我想在 TextBox 控件中打印结果。
是否可以为此使用 javascriptSerializer,还是应该使用 JSON.net?除非我必须这样做,否则我想避免反序列化字符串。
【问题讨论】:
你的意思是用换行符和缩进格式化它? 这可能是重复的吗? ***.com/questions/4580397/json-formatter-in-c 您想格式化您的 JSON 代码以使其看起来美观且可读吗?但是格式化 JSON 代码与反序列化有什么关系呢? 是的,我说的是美化、换行、缩进。我不想/不需要反序列化任何东西,我只是觉得如果我使用 JSON.Net 我必须反序列化 => 序列化才能获得漂亮的 json 输出。 【参考方案1】:使用JSON.Net,您可以使用特定格式美化输出。
Demo 在 dotnetfiddle 上。
代码
public class Product
public string Name get; set;
public DateTime Expiry get; set;
public string[] Sizes get; set;
public void Main()
Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Sizes = new string[] "Small" ;
string json = JsonConvert.SerializeObject(product, Formatting.None);
Console.WriteLine(json);
json = JsonConvert.SerializeObject(product, Formatting.Indented);
Console.WriteLine(json);
输出
"Name":"Apple","Expiry":"2008-12-28T00:00:00","Sizes":["Small"]
"Name": "Apple",
"Expiry": "2008-12-28T00:00:00",
"Sizes": [
"Small"
]
【讨论】:
我认为这未被接受为答案的原因是,使用这种方法美化 JSON 需要在重新序列化之前先进行反序列化? @Jimbo 确实。我会检查替代方案。也可以找stuartdanswer【参考方案2】:参加这个聚会有点晚了,但是您可以美化(或缩小)Json,而无需使用 Json.NET 进行反序列化:
JToken parsedJson = JToken.Parse(jsonString);
var beautified = parsedJson.ToString(Formatting.Indented);
var minified = parsedJson.ToString(Formatting.None);
编辑:跟进 cmets 中关于性能的讨论,我使用 BenchMark.Net 进行测量,使用 JToken.Parse
会产生额外的分配成本,并且所花费的时间增加非常小:
Benchmark code
【讨论】:
解析创建JToken时,不是创建动态对象吗? @aloisdg 可能,是的。 我必须检查性能问题。我不确定我们是否在这里获胜。 docs 说 “读取和写入 JSON 绝对最快的方法是直接使用 JsonTextReader/JsonTextWriter 手动序列化类型” 但对于大多数涉及格式化 Json 的用例没必要,a lot more effort.【参考方案3】:ShouldSerializeContractResolver.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;
var beautifyJson= Newtonsoft.Json.JsonConvert.SerializeObject(data, new JsonSerializerSettings()
ContractResolver = ShouldSerializeContractResolver.Instance,
NullValueHandling = NullValueHandling.Ignore,
Formatting = Formatting.Indented
);
你可以用上面的代码美化json
【讨论】:
这不完整,显示什么是ShouldSerializeContractResolver
。
gist.github.com/ridvanc/34f45923162cfd168e4c97e60439c5b8可以看到上面的链接
请再次查看评论【参考方案4】:
您可以使用新的 System.Text.Json 命名空间处理 JSON 而无需反序列化,以避免添加对 json.NET 的依赖。诚然,这不如 stuartd's simple answer 简洁:
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());
The docs have more examples of how to use the low-level types in the namespace.
【讨论】:
以上是关于如何美化 JSON 以在 TextBox 中显示?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JSON 中循环数组 imageURL 以在图像视图中显示
如何重新构建我的复杂 Json 响应以在 SectionList React native 中显示