json.net-制作属性以检查空字符串属性值



带有属性[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调用。

相关内容

  • 没有找到相关文章

最新更新