英文:
Required Annotation in Sub-Class overrules JsonIgnore Attribute in Main-Class
问题
The [Required]
attribute on the child class does take precedence over the [JsonIgnore]
attribute on the parent class when it comes to JSON serialization and deserialization. This is why you're encountering issues with deserialization when using the [JsonIgnore]
attribute.
To fix this, you can consider using a custom JSON converter or creating a separate DTO (Data Transfer Object) for serialization and deserialization. The DTO can exclude the reference to the parent and include only the necessary properties, while your original class with [Required]
attributes can be used for UI and other purposes.
If you decide to use a custom JSON converter, you can implement custom logic to handle the serialization and deserialization of the parent-child relationship in a way that works for your requirements.
In summary, to address this issue, you may need to separate your serialization and UI concerns by using DTOs or custom converters to control how your objects are serialized and deserialized.
英文:
tldr: serialisation works as expected, deserialisation ignores [JsonIgnore]
attribute when ignored child has a [Required]
attribute.
I use the System.Text.Json
Serializer (Newtonsoft is not included in the Project) to Read/Write a list of parent objects over REST. The parent class has a list of child objects. The Child objects have a referece set back to the parent. Although I talk about childs and parents, they do not inherent from each other. To avoid a loop i set the reference to the parent to [JsonIgnore]
. Works on the GET-Endpoint. Failes on the PUT.
Error message:
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-d41897820e0a0771cf9278cb64fb8bb4-36a021adba8a4493-00",
"errors": {
"": [
"The input was not valid."
],
"Parents[0].Childs[0].Parent.Prop1": [
"The Prop1 field is required."
],
"Parents[0].Childs[0].Parent.Prop2": [
"The Prop2 field is required."
],
"Parents[0].Childs[0].Parent.Prop3": [
"The Prop3 field is required."
],
"Parents[0].Childs[1].Parent.Prop1": [
"The Prop1 field is required."
],
"Parents[0].Childs[1].Parent.Prop2": [
"The Prop2 field is required."
],
"Parents[0].Childs[1].Parent.Prop3": [
"The Prop3 field is required."
],
...
The Main-Class:
public class Parent
{
public int ID { get; set; }
[Required(AllowEmptyStrings = false)]
public string Prop1{ get; set; } = string.Empty;
[Required(AllowEmptyStrings = false)]
public string Prop2 { get; set; } = string.Empty;
[Required(AllowEmptyStrings = false)]
public string Prop3 { get; set; } = string.Empty;
public List<Child> Childs{ get; set; } = new();
}
The Child-Class:
public class Child
{
public int Id { get; set; }
[JsonIgnore]
public Parent Parent { get; set; } = new();
[Required]
public int ChildProp { get; set; }
}
Is the [Required] Attribute of a Child higher-Prior than a [JsonIgnore] in the Parent?
How can I fix that? Removing the Required Annotations is not a Option because I neet them for my UI.
I tried to use the different Conditions of the JsonIgnore with no effect.
答案1
得分: 0
我找到了一个解决方案。将父属性的getter方法更改为internal就可以了。
public class Child
{
public int Id { get; set; }
[JsonIgnore]
public Parent Parent { internal get; set; } = new();
[Required]
public int ChildProp { get; set; }
}
再次感谢AVTUNEY向我展示自定义JSON转换器。通过稍加努力,可以确实以这种方式解决问题。
英文:
I found a solution. Making the getter of the Parent-Property internal will do the trick.
public class Child
{
public int Id { get; set; }
[JsonIgnore]
public Parent Parent { internal get; set; } = new();
[Required]
public int ChildProp { get; set; }
}
Thanks again for AVTUNEY for showing me custom json converters. With a little extra effort, the problem could certainly have been solved this way.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论