ServiceStack使用必需属性反序列化Json



如果某个JSON属性丢失,我正试图让反序列化引发异常。这应该反序列化fine(确实如此(:

{
"Property1": 0,
"Property2": "value",
"Property3": {
"ChildProperty1": 0,
"ChildProperty2": "value",
}
}

但我希望这引发一个异常(因为缺少ChildProperty1(:

{
"Property1": 0,
"Property2": "value",
"Property3": {
"ChildProperty2": "value",
}
}

我目前正在反序列化JSON字符串,如下所示:

var settings = settingsString.FromJson<Settings>();

我的设置类如下:

[DataContract]
public record Settings
{
[DataMember]
public int Property1 { get; init; }
[DataMember]
public string Property2 { get; init; }
[DataMember]
public MyType Property3 { get; init; }
}
[DataContract]
public record MyType
{
[DataMember]
public int ChildProperty1 { get; init; }
[DataMember]
public string ChildProperty2 { get; init; }
}

我试过用[DataMember(IsRequired = true)][DataMember, ServiceStack.DataAnnotations.Required]来装饰房子,但都没有效果。

我也读过关于BindRequiredAttribute的这一页,但我猜这也不会影响ServiceStack反序列化程序。

有没有一种方法可以用ServiceStack实现这一点,或者我可能需要使用不同的反序列化程序来更容易地实现这一目标?

看看SerializationHookTests.cs,它显示您可以在序列化/反序列化期间使用不同的钩子属性来运行不同的代码,因此您应该能够在[OnDeserialized]方法中添加自定义验证:

public class HookExamples
{
[OnDeserializing]
protected void OnDeserializing(StreamingContext ctx)
{
// Will be executed when deserializing starts
}
[OnDeserialized]
protected void OnDeserialized(StreamingContext ctx)
{
// Will be executed when deserializing finished
}
[OnSerializing]
protected void OnSerializing(StreamingContext ctx)
{
// Will be executed when serializing starts
}
[OnSerialized]
protected void OnSerialized(StreamingContext ctx)
{
// Will be executed when serializing finished
}
}

最新更新