问题描述
我想在反序列化后获得嵌套的 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);