C# 如何向Json.NET输出添加注释?

C# 如何向Json.NET输出添加注释?,c#,json,json.net,C#,Json,Json.net,有没有一种方法可以自动将注释添加到Json.NET的序列化输出中 理想情况下,我会想象它与以下类似: public class MyClass { [JsonComment("My documentation string")] public string MyString { get; set; } } 或者(如果可以避免注释,则更好): 我询问的原因是,我们使用Json.NET序列化配置文件,稍后可以手动更改。我希望在我的C#配置类中包含文档,并将其复制

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

理想情况下,我会想象它与以下类似:

public class MyClass
{
    [JsonComment("My documentation string")]
    public string MyString { get; set; }
}
或者(如果可以避免注释,则更好):

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


正如RoToRa在下面指出的,JSON规范在技术上不允许使用注释(请参阅第页的方便语法图)。但是,上的功能表包括:

支持阅读和撰写评论


Newtonsoft.Json.JsonTextWriter.WriteComment(string)
存在,它会输出注释。我对创建注释的简洁方式感兴趣,而不是直接使用
JsonTextWriter

问题是JSON作为文件格式不支持注释。如果读取JSON文件的应用程序允许,您可以做的一件事是使用附加属性作为注释,如本问题所述:

正如@RoToRa已经说过的,JSON不允许注释

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

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

Json.NET JsonSerializer在序列化时不会自动输出注释。您需要手动编写JSON,如果需要注释,可以使用JsonTextWriter或LINQ to JSON。可以做一些事情来向输出中添加注释,但我不会这么做,除非出于真正的绝望

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

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
类。

@JamesNewtonKing我已经为最新的Json.net编写了一个小补丁,向
JsonProperty
(和
JsonPropertyAttribute
)添加
注释
属性。其思想是,在
SerializeMemberInfo
期间,如果
注释
不是null/empty,则会在JSON中的键/值对上方写出它。在我继续完成之前,这是你感兴趣的东西吗?我会看一看,看看你是怎么做的,我是否认为这对其他人有用-@AdamRodger你还有补丁吗?我在网上找不到它。@JamesNewton King有什么收获吗?@JamesNewton King也对此感兴趣。@JamesNewton King目前有没有类似的计划或可用?
{
    "Name": "Jack"/*Name of the person*/,
    "Age": 22/*Age of the person*/
}