在运行时,我想打印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() 函数中消除运行时特定字段的最佳方法是什么?
到目前为止,最简单的方法是使用 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]
属性。