将嵌套的 JSON 反序列化为 C# childObject 类

问题描述

我想在反序列化后获得嵌套的 json 对象结果,如下面的代码所示。

var matrixDto = new QuestionMatrixDto();
           
// First child Dto:

matrixDto.displayAnswers = "displayAnswers Test";
matrixDto.questionWeight = 10;

// Second child dto:

var essayDto = new QuestionessayDto();
essayDto.addToBank= true;
essayDto.questionLength = 10;

// Parent Dto:

var obj = new V2ObjectDto();
obj.name = "object test";
obj.childobjects.Add(matrixDto);
obj.childobjects.Add(essayDto);

JsonSerializerSettings settings = new JsonSerializerSettings
                {
                    TypeNameHandling = TypeNameHandling.All
                };

var serlizeObj = JsonConvert.SerializeObject(obj,settings );
 
var deserlizeObj = JsonConvert.DeserializeObject<V2ObjectDto>(serlizeObj,settings );

但是现在当我尝试访问时

var matrixResult = deserlizeObj.childobjects.FirstOrDefault();
matrixResult.displayAnswers;

matrixResult.displayAnswers 不可访问且没有定义

在反序列化后,我需要与序列化对象之前相同的结果,但问题是在反序列化后我无法获得任何问题(或子 Dto)属性值。

序列化结果:

{
    "id": null,"text": null,"guid": null,"containerId": null,"name": "object test","testName": null,"childobjects": [{
            "questionText": null,"testStatus": null,"displayAnswers": "displayAnswers Test","questionWeight": 10,"answers": [],"questions": [],"questionAnswersDto": [],"userAnswer": {
                "selectedAnswers": [],"id": null,"comments": null,"questionId": null
            },"keywords": null,"commentObj": {
                "watermarkText": null,"commentText": null,"textType": null,"userComment": null,"isCorrect": false,"totalCharacters": null
            },"questionSelectDto": {
                "questionType": null,"addToBank": false,"numberOfAnswersAllow": null,"displayAnsweras": null,"name": "","childobjects": [],"objectType": 0,"sortOrder": 0,"height": null,"keywords": null
            },"FeedBackText": null,"questionType": null,"height": null
        },{
            "id": null,"questionText": null,"minCharecters": null,"maxCharecters": null,"userAnswer": {
                "essayText": null,"displayAnsweras": "displayAnswers for Test","height": null
        }
    ],"keywords": null
}

问题 Dto 是 ObjectDto like 的子 dto

class QuestionDto : V2ObjectDto

注意父类属性将保持不变,但子类及其属性将根据我在上面代码中提到的问题类型进行更改。

请帮我解决这个问题或让我知道任何其他可能的解决方案。

解决方法

在以下示例中,类处于分层结构中。如果序列化正确,就会正确执行反向操作。

public class BaseClass
{
    public int ID { get; set; }
    public ChildClass childObject { get; set; }
}
public class ChildClass
{
    public int ID { get; set; }
    public List<NodeClass> nodeObjects { get; set; }
}
public class NodeClass
{
    public string Name { get; set; }
    public int Order { get; set; }
}

现在使用

BaseClass bc = new BaseClass();
bc.ID = 1;
bc.childObject = new ChildClass()
{
   ID = 1,nodeObjects=new List<NodeClass>()
   {
       new NodeClass(){Name="Name 1",Order =1},new NodeClass(){Name="Name 2",Order =2},new NodeClass(){Name="Name 3",Order =3},}
};

string json = JsonConvert.SerializeObject(bc);
BaseClass result = JsonConvert.DeserializeObject<BaseClass>(json);