c# - 如何将 json 对象反序列化为复杂对象?
问题描述
我正在尝试将 JSON 对象反序列化为具有某些“对象”属性的对象,这些属性可能每次都不同。我有一个序列化器/反序列化器函数,在使用简单变量类型或定义的变量类型时可以正常工作。
我尝试将对象转换为正确的类,尝试将对象作为动态对象,等等。但是,我总是遇到异常:“对象引用未建立......”
反序列化函数:
public static T deserializeJSON<T>(string json)
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType($
obj = (T)serializer.ReadObject(ms);
}
return obj;
}
示例对象:
[DataContract]
class Client
{
[DataMember] private string name;
[DataMember] private string address;
[DataMember] private string bio;
[DataMember] private object specific; //WHERE SPECIFIC MAY BE ANY OTHER OBJECT THAT I CAST AFTER DESERIALIZATION
}
示例对象 2:
[DataContract]
class Server
{
[DataMember] private string name;
[DataMember] private int value;
}
特定属性可以是任何其他对象。想象一下“特定”属性是一个服务器类型的对象;反序列化函数可以很好地加载所有属性,而不是作为对象加载的特定属性,但不能将其转换为 Server。
PD:在反序列化的那一刻,我知道“特定”属性是什么类类型。
谢谢!
解决方案
使用最新的 json.net 你可以使用
dynamic data = Json.Decode(json);
或者
dynamic data = JObject.Parse(json);
并且可以使用以下代码访问数据:
data.Date;
data.Items.Count;
data.Items[0].Name;
data.Items[0].Price;
data.Items[1].Name;
推荐阅读
- javascript - 将隐藏 ID 附加到动态创建的 DIV
- c++ - 旅行推销员分而治之 C++
- node.js - TypeError:无法读取未定义的属性“RichEmbed”
- python - 我无法使用 Python 将名称中包含空格的文件上传到 Google Cloud Storage。我究竟做错了什么?
- python - 如何使用 python 编写指向 CSV 文件的超链接?
- python - CNN 培训时间过长(小时)
- flutter - 将 curl 获取请求转换为 dart 请求
- angular - 检查联系电话和电子邮件是否是假的?
- firefox - Rust 不接受来自本地消息传递的标准输入的输入 - firefox
- javascript - 如何在 Duktape 中实现非阻塞事件循环?