JSON.NET - 制作属性以检查空字符串属性值

Nas*_*már 1 .net c# json json.net

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

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

这个 JSON 应该会引起问题

{
  "Property1": "",
   ... 
}
Run Code Online (Sandbox Code Playgroud)

小智 5

通过使用 JSON 模式,您可以定义特定属性的最小长度等。在对反序列化代码进行轻微修改以指定用于验证的架构之后,使用附加的Json.NET Schema包相当简单。但是,与 Json.NET 本身不同,Json.NET Schema 库未获得 MIT 许可并且使用限制性/商业许可。不过,可能还有其他实现。

在类似的情况下,我最终 (ab) 使用 aJsonConverter来进行验证。这有点 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

[JsonProperty(Required = Required.Always)]
[JsonConverter(typeof(NonEmptyStringConverter))]
public string Property1 { get; set; }
Run Code Online (Sandbox Code Playgroud)

Required.Always仍应适用于处理这种情况的财产是完全缺失的情况下,在这种情况下,转换器将不会被Json.NET调用。