删除特定于 JSON 的节点

本文关键字:节点 JSON 删除 | 更新日期: 2023-09-27 17:56:49

在运行时,我想打印JSon来记录,但审查其中一个字段。我使用 JSon.Net 并具有所有属性,例如

    public Class Terms
    {
        [JsonProperty("Term")]
        string term
        [JsonProperty("SecretTerm")]
        string SecretTerm
        public string toCensoredString()
        {
         // I need to get a JSON string with only the regular term and not the secret
         var jsonRequest = JsonConvert.SerializeObject(this);
         // .....
        }
    }

在我的新 ToCensoredString() 函数中消除运行时特定字段的最佳方法是什么?

删除特定于 JSON 的节点

到目前为止,最简单的方法是使用 JsonIgnore 属性。

如果我创建一个这样的Terms对象:

Terms terms = new Terms() { SecretTerm = "Secret", Term = "Not secret" };

如果SecretTerm看起来像这样:

[JsonIgnore]
[JsonProperty("SecretTerm")]
public string SecretTerm { get; set; }

序列化的 JSON 将如下所示:

{
    "Term": "Not secret"
}

如果您想要更精细的控制,则必须创建自定义转换器。

编辑:

要更有选择性地输出对象,您需要自定义转换器:

class TermsConverter : Newtonsoft.Json.JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(Terms) == objectType;
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Terms terms = (Terms)value;
        writer.WriteStartObject();
        writer.WritePropertyName("Term");
        writer.WriteValue(terms.Term);
        writer.WriteEndObject();
    }
}

序列化时,应执行以下操作:

var jsonRequest = JsonConvert.SerializeObject(this, new TermsConverter());

您会注意到我未实现ReadJson - 我认为没有必要,因为您可以在不使用转换器的情况下轻松反序列化Terms对象。在这种情况下,SecretTerm属性将仅为空。

通过使用转换器,您将不需要 SecretTerm 属性上的 [JsonIgnore] 属性。