C# 解码 JSON - 所有对象都相同,但名称唯一
本文关键字:唯一 JSON 解码 对象 | 更新日期: 2023-09-27 18:33:11
>有人对System.Runtime.Serialization.Json和DataContracts有任何经验吗?我有一个Perl脚本,我正在转换为C#,我似乎无法弄清楚如何制作这个DataContract来解释来自网站的响应是一堆对象的事实。我试图假装对象不存在,并且我试图定义一个合约,指定出现的第一个对象字符串,但我无法让它解析任何单个数据位。下面是作为请求响应返回的 200 个对象中的 2 个示例。
当前数据协定尝试:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(JsonMachines));
JsonMachines machines = (JsonMachines)ser.ReadObject(resp.GetResponseStream());
[DataContract]
class JsonMachines
{
[DataMember]
public JsonMachine dc54806f4fe34cf5a83b0676555f8658;
}
[DataContract]
class JsonMachine
{
[DataMember]
public string guid;
[DataMember]
public int lost_contact;
[DataMember]
public string org;
[DataMember]
public string timezone;
}
来自服务器的 JSON 响应:
{
"dc54806f4fe34cf5a83b0676555f8658" : {
"shadowprotect" : {
"jobs" : [],
"version" : {
"is_expired" : false,
"is_running" : true,
"lang" : "en",
"is_installed" : true,
"version" : "6.0.8",
"is_trial" : false,
"name" : "ShadowProtect SPX",
"is_msp" : false,
"company" : ""
}
},
"lost_contact" : 0,
"org" : "site : name",
"timezone" : -18000,
"status" : "ok",
"name" : "MACHINENAME2",
"tags" : [],
"machine_details" : {
"last_boot" : "2016-01-21T10:54:11.557000",
"volumes" : [
{
"mountpoint" : "C:''",
"device" : "''''?''Volume{07897f98-6618-11e5-8055-806e6f6e6963}''",
"size" : 305242,
"boot" : false,
"readonly" : false,
"removable" : false,
"os_vol" : true,
"used" : 57787,
"label" : ""
},
{
"mountpoint" : null,
"device" : "''''?''Volume{07897f99-6618-11e5-8055-806e6f6e6963}''",
"size" : 99,
"boot" : false,
"readonly" : false,
"removable" : false,
"os_vol" : false,
"used" : 28,
"label" : "System Reserved"
}
],
"ram" : 3945
},
"imagemanager" : {
"folders" : []
}
},
"c947116fc62c40c2932e850944f78550" : {
"shadowprotect" : {
"jobs" : [],
"version" : {
"is_expired" : true,
"is_running" : true,
"days_to_expire" : 0,
"lang" : "en",
"is_installed" : true,
"version" : "4.2.7.19756",
"name" : "ShadowProtect",
"is_msp" : true,
"company" : null
}
},
"lost_contact" : 0,
"org" : "site : name2",
"timezone" : -18000,
"status" : "ok",
"name" : "MACHINENAME",
"tags" : [],
"machine_details" : {
"last_boot" : "2016-01-28T08:34:54.486000",
"volumes" : [
{
"mountpoint" : "C:''",
"device" : "''''?''Volume{bcbc546f-291f-11e2-9a3f-806e6f6e6963}''",
"size" : 476153,
"boot" : false,
"readonly" : false,
"removable" : false,
"os_vol" : true,
"used" : 145434,
"label" : "OS"
},
{
"mountpoint" : null,
"device" : "''''?''Volume{bcbc546e-291f-11e2-9a3f-806e6f6e6963}''",
"size" : 745,
"boot" : false,
"readonly" : false,
"removable" : false,
"os_vol" : false,
"used" : 224,
"label" : "RECOVERY"
}
],
"ram" : 4052
},
"imagemanager" : {
"folders" : []
}
}
}
将
JsonMachine.timezone定义为字符串可能会有所不同,但在JSON中,它显示为整数。
另外,请记住,DataContractSerializer 是与顺序相关的。 据我所知,它应该选择"org"和"时区"。 由于您没有使用[DataMember(Order = 1)]
它按字母顺序查看。
dc54806f4fe34cf5a83b0676555f8658 对象上没有"guid"属性或"lost_contact"属性,因此"org"是它首先要查找的内容。 找到它后,它永远不会在将来的查找中查看以前的属性。 据说这是一种性能提升。
您可以使用上面的属性自己设置特定的订单期望。 但是顺序必须一致,因为如果对象混乱,您将遇到DataContractSerializer问题,并且可能不得不移动到Newtonsoft.Json,这是一个不错的库。
可能的欺骗...
如何使用 json.NET 反序列化动态命名的根节点