JSON.NET-创建属性以检查空字符串属性值

时间:2019-03-01 17:42:51

标签: c# .net json json.net

使用属性[JsonProperty(Required = Required.Always)]注释我的模型,我可以检查该属性值是否不为null。

对于字符串,我也想检查空值。在Json.NET中使用属性时,是否有办法检查字符串属性值是否为空?还是还有其他方法?

此JSON应该会引起问题

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

1 个答案:

答案 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将不会调用该转换器。