在运行期间我想打印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()函数中消除运行时特定字段的最佳方法是什么?
答案 0 :(得分:1)
到目前为止,最简单的方法是使用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
属性将为空。
通过使用转换器,您不需要[JsonIgnore]
属性上的SecretTerm
属性。