[英]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.