当前位置: 动力学知识库 > 问答 > 编程问答 >

c# - Remove Json specific node

问题描述:

during run time I'd like to print JSon to log but censor one of its fields.

I use JSon.Net and have all the attributes, for example

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

// .....

}

}

What will be the best way to eliminate specific field in runtime in my new ToCensoredString() function?

网友答案:

By far the easiest approach is to use the JsonIgnore attribute.

If I create a Terms object like this:

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

And if SecretTerm looks like this:

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

Your serialized Json will look like this:

{
    "Term": "Not secret"
}

If you want more fine-grained control you will have to create a custom converter.

Edit:

To more selectively output the object, you need the custom converter:

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

When serializing, you would do this:

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

You'll note that I have left the ReadJson unimplemented - I don't think it's necessary as you can easily deserialize a Terms object without using a converter. In this case the SecretTerm property would simply be empty.

By using the converter you won't need the [JsonIgnore] attribute on the SecretTerm property.

分享给朋友:
您可能感兴趣的文章:
随机阅读: