【问题标题】:How do I add comments to Json.NET output?如何向 Json.NET 输出添加注释?
【发布时间】:2012-02-29 08:24:36
【问题描述】:

有没有一种方法可以自动将 cmets 添加到 Json.NET 的序列化输出中?

理想情况下,我认为它类似于以下内容:

public class MyClass
{
    [JsonComment("My documentation string")]
    public string MyString { get; set; }
}

或者(如果可以避免注释就更好了):

public class MyClass
{
    /// <summary>
    /// My documentation string
    /// </summary>
    public string MyString { get; set; }
}

会产生:

{
    // My documentation string
    "MyString": "Test"
}

我问的原因是我们使用 Json.NET 序列化配置文件,以后可以手动更改。我想在我的 C# 配置类中包含文档,并将其复制到 JSON 中,以帮助以后可能需要更改文件的人。


正如 RoToRa 在下面指出的,在 JSON 规范中技术上不允许 cmets(请参阅 http://www.json.org 的方便语法图)。但是,Json.NET site 上的功能表包括:

支持读写cmets

Newtonsoft.Json.JsonTextWriter.WriteComment(string) 存在,它确实输出了一条评论。我对创建 cmets 的简洁方式感兴趣,而不是直接使用 JsonTextWriter

【问题讨论】:

  • @JamesNewtonKing 目前有这样的计划或可用吗?

标签: c# json json.net


【解决方案1】:

Json.NET JsonSerializer 在序列化时不会自动输出 cmets。如果需要 cmets,则需要手动编写 JSON,使用 JsonTextWriter 或 LINQ to JSON

【讨论】:

  • @JamesNewtonKing 我已经为最新的 Json.NET 编写了一个小补丁,以将 Comment 属性添加到 JsonProperty(和 JsonPropertyAttribute)。这个想法是,在SerializeMemberInfo 期间,如果Comment 不为空/空,那么它会在 JSON 中的键/值对上方写出。在我继续完成之前,您会对此感兴趣吗?
  • 我会看看它,看看你是如何做到的,以及我认为它是否对其他人有用 - json.codeplex.com/SourceControl/list/patches/upload
  • @AdamRodger 你还有补丁吗?我在网上找不到。
  • @JamesNewton-King 这有什么结果吗?
  • @JamesNewton-King 也对此感兴趣。
【解决方案2】:

问题在于 JSON 作为文件格式不支持 cmets。您可以做的一件事 - 如果读取 JSON 文件的应用程序允许它 - 是使用附加属性作为 cmets,如此问题中所建议的:Can comments be used in JSON?

【讨论】:

    【解决方案3】:

    正如@RoToRa 已经说过的,JSON 不允许 cmets。

    如果您仍然需要 cmets,并且想要输出正确的 JSON,则可以通过更改数据布局使 cmets 成为实际 JSON 数据的一部分。例如:

    {
        "MyString": {
            "doc":   "My documentation string",
            "value": "Test"
        } 
    }
    

    【讨论】:

      【解决方案4】:

      嗯,有某事可以为输出添加注释,但我不会这样做,除非是真的绝望。

      您可以编写自定义转换器:

      public class JsonCommentConverter : JsonConverter
      {
          private readonly string _comment;
          public JsonCommentConverter(string comment)
          {
              _comment = comment;
          }
      
          public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
          {
              writer.WriteValue(value);
              writer.WriteComment(_comment); // append comment
          }
      
          public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
              JsonSerializer serializer)
          {
              throw new NotImplementedException();
          }
      
          public override bool CanConvert(Type objectType) => true;
          public override bool CanRead => false;
      }
      

      并在您的课程中使用它:

      public class Person
      {
          [JsonConverter(typeof(JsonCommentConverter), "Name of the person")]
          public string Name { get; set; }
      
          [JsonConverter(typeof(JsonCommentConverter), "Age of the person")]
          public int Age { get; set; }
      }
      

      序列化你的类

       var person = new Person { Name = "Jack", Age = 22 };
       var personAsJson = JsonConvert.SerializeObject(person, Formatting.Indented);
      

      将创建以下输出:

      {
          "Name": "Jack"/*Name of the person*/,
          "Age": 22/*Age of the person*/
      }
      

      Json.net 会毫无问题地将此字符串转换回Person 类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-15
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        • 2014-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多