C# 如何向Json.NET输出添加注释?
有没有一种方法可以自动将注释添加到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#配置类中包含文档,并将其复制
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*/
}