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" : []
      }
   }
}

C# 解码 JSON - 所有对象都相同,但名称唯一

JsonMachine.timezone定义为字符串可能会有所不同,但在JSON中,它显示为整数。

另外,请记住,DataContractSerializer 是与顺序相关的。 据我所知,它应该选择"org"和"时区"。 由于您没有使用[DataMember(Order = 1)]它按字母顺序查看。

dc54806f4fe34cf5a83b0676555f8658 对象上没有"guid"属性或"lost_contact"属性,因此"org"是它首先要查找的内容。 找到它后,它永远不会在将来的查找中查看以前的属性。 据说这是一种性能提升。

您可以使用上面的属性自己设置特定的订单期望。 但是顺序必须一致,因为如果对象混乱,您将遇到DataContractSerializer问题,并且可能不得不移动到Newtonsoft.Json,这是一个不错的库。

可能的欺骗...

如何使用 json.NET 反序列化动态命名的根节点