使用属性[JsonProperty(Required = Required.Always)]
注释我的模型,我可以检查该属性值是否不为null。
对于字符串,我也想检查空值。在Json.NET中使用属性时,是否有办法检查字符串属性值是否为空?还是还有其他方法?
此JSON应该会引起问题
{
"Property1": "",
...
}
答案 0 :(得分:2)
通过使用JSON模式,您可以定义特定属性的最小长度,等等。在对反序列化代码进行了少许修改以指定要用于验证的模式之后,使用附加的Json.NET Schema包可以相当简单地完成此操作。但是,与Json.NET本身不同,Json.NET Schema库未获得MIT许可,而是使用限制性/商业性许可。不过,可能还有其他实现方式。
在类似的情况下,我最终使用JsonConverter
来进行验证。这有点麻烦,因为它不是真正的转换器,但方便的是,它仅通过将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将不会调用该转换器。