如何美化 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 中显示

如何在 NSDictionary 中访问本地 JSON 文件响应以在 UITableView 中显示?

无法加载 JSON 数据以在 ListView 中显示

如何解析和渲染 json 以在 Django 模板中使用

如何在 Python 中美化 JSON?