我有一个这样的模特
public class ObjectA
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public object OtherData { get; set; }
}
和Json数据一样
{
"id" : 12 ,
"name": "Ababa",
"description": "data Des",
"otherData": {
"signTime":null,
"objectId":129,
"confirmStatus": null,
"note": "nothing"
}
}
我收到此数据并使用 Newtonsoft.Json 提供程序的 JsonConvert.Deserializer 将此 Json 解析为我的对象,但在返回数据类型 IAcctionResult 后,它们的控制器值变得像这样
{
"id" : 12 ,
"name": "Ababa",
"description": "data Des",
"otherData": {
"signTime":[],
"objectId":[],
"confirmStatus": [],
"note": []
}
}
我的代码哪里错了?
我的结果预期类似于接收 json 数据(而不是使用将 otherData 解析为字符串的方式)。 谢谢大家。
当您将 JSON 反序列化为 ObjectA 类,然后再次序列化它以从 IActionResult 返回时,对象类型的 OtherData 属性似乎未正确序列化回 JSON。它不是将其序列化为嵌套对象,而是将 OtherData 的属性序列化为数组。
最可能的问题是序列化和反序列化期间处理 OtherData 的方式。由于 OtherData 是对象类型,因此序列化程序可能无法推断嵌套属性的正确类型。
以下是诊断和解决此问题的一些步骤:
检查您的序列化设置:确保序列化 反序列化和序列化时的设置保持一致 对象一个对象。
强类型其他数据:而不是使用对象类型 OtherData,定义一个代表的类是一个很好的做法 其他数据的结构。这样,序列化器就可以准确地知道 怎么处理。
自定义转换器:如果您必须使用对象作为其他数据,您可能需要 编写一个可以处理序列化的自定义 JsonConverter 正确反序列化该属性。
以下是如何实施前两条建议的快速说明:
为其他数据定义强类型
public class ObjectA
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public OtherData OtherData { get; set; }
}
public class OtherData
{
public DateTime? SignTime { get; set; }
public int? ObjectId { get; set; }
public bool? ConfirmStatus { get; set; }
public string Note { get; set; }
}
反序列化和序列化 当你反序列化时,你会做类似的事情:
var myObject = JsonConvert.DeserializeObject<ObjectA>(jsonString);
当你将其序列化回 JSON 时:
var jsonResult = JsonConvert.SerializeObject(myObject);
如果您进行这些调整并且您的 OtherData 是已定义的类而不是普通对象,则序列化程序将知道如何正确处理属性。
但是,如果由于内容的动态性质,您仍然希望将 OtherData 保留为对象,则可能需要实现自定义 JsonConverter。