簡體   English   中英

JSON.NET-創建屬性以檢查空字符串屬性值

[英]JSON.NET - Make attributes to check for empty string property values

使用屬性[JsonProperty(Required = Required.Always)]注釋我的模型,我可以檢查該屬性值是否不為null。

對於字符串,我也想檢查空值。 在Json.NET中使用屬性時,是否有辦法檢查字符串屬性值是否為空? 還是還有其他方法?

此JSON應該引起問題

{
  "Property1": "",
   ... 
}

通過使用JSON模式,您可以定義特定屬性的最小長度,等等。 在對反序列化代碼進行了少許修改以指定用於驗證的模式之后,使用附加的Json.NET Schema包,這相當簡單。 但是,與Json.NET本身不同,Json.NET Schema庫未獲得MIT許可,而是使用限制性/商業性許可。 但是,可能還有其他實現。

在類似的情況下,我最終(ab)使用JsonConverter進行了驗證。 這有點hacky,因為它並不是真正的轉換器,但是方便的事情是,它僅通過將Json.NET屬性應用於模型即可工作,而無需任何其他代碼更改。

public class NonEmptyStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) => objectType == typeof(string);

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        => throw new NotImplementedException();

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType != JsonToken.String)
            throw CreateException($"Expected string value, but found {reader.TokenType}.", reader);

        var value = (string)reader.Value;

        if (String.IsNullOrEmpty(value))
            throw CreateException("Non-empty string required.", reader);

        return value;
    }

    private static Exception CreateException(string message, JsonReader reader)
    {
        var info = (IJsonLineInfo)reader;
        return new JsonSerializationException(
            $"{message} Path '{reader.Path}', line {info.LineNumber}, position {info.LinePosition}.",
            reader.Path, info.LineNumber, info.LinePosition, null);
    }
}

用法:

[JsonProperty(Required = Required.Always)]
[JsonConverter(typeof(NonEmptyStringConverter))]
public string Property1 { get; set; }

在仍然完全缺少該屬性的情況下,仍然應始終使用Required.Always ,在這種情況下,Json.NET將不會調用該轉換器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM