如何为Json.NET输出添加注释?

时间:2012-02-29 08:24:36

标签: c# json json.net

有没有办法可以自动为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规范中技术上不允许发表评论(请参阅http://www.json.org处的方便语法图)。但是,Json.NET site上的功能表包括:

  

支持阅读和撰写评论

存在

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

4 个答案:

答案 0 :(得分:5)

Json.NET JsonSerializer在序列化时不会自动输出注释。如果你想要评论,你需要手动编写你的JSON,使用JsonTextWriter或LINQ to JSON

答案 1 :(得分:4)

问题是JSON作为文件格式不支持注释。您可以做的一件事 - 如果阅读JSON文件的应用程序允许它 - 是使用其他属性作为此问题中建议的注释:Can comments be used in JSON?

答案 2 :(得分:2)

正如@RoToRa所说,JSON不允许发表评论。

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

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

答案 3 :(得分:1)

有人可以做些什么,以便在输出中添加评论,但我会这么做,除非出于真正的绝望。

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

A = N(J.subs({"x": xx, "y": yy}))

并在您的班级中将其用作:

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);

Json.net将毫无问题地将该字符串转换回{ "Name": "Jack"/*Name of the person*/, "Age": 22/*Age of the person*/ } 类。