0

実行時に JSON を出力してログに記録したいのですが、そのフィールドの 1 つを検閲します。私は 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() 関数で実行時に特定のフィールドを削除する最良の方法は何ですか?

4

1 に答える 1

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

于 2013-01-31T06:12:30.737 に答える