带有属性[JsonProperty(Required = Required.Always)]
注释我的模型,我可以检查属性值不是null。
对于字符串,我也想检查空值。是否有一种方法可以检查字符串属性值在使用json.net中使用属性时是否为空?还是还有其他方法?
这个JSON应该引起问题
{
"Property1": "",
...
}
通过使用JSON模式,您可以定义特定属性的最小长度,除其他外。使用附加的JSON.NET架构软件包,这是相当简单的,在对避风式代码进行了轻微的修改以指定用于验证的模式。但是,与JSON.NET本身不同,JSON.NET模式库未获得MIT许可,并且使用限制性/商业许可。不过,可能还有其他实现。
在类似的情况下,我使用JsonConverter
最终(AB)进行验证。这有点骇客,因为它不是真正的转换器,但是方便的是,它纯粹是通过将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调用。