JSON.带数字的.NET字段名



我正在为我的雇主构建一个到思科ClearAccess应用程序的接口,我发现了一些奇怪的东西,想知道是否有人有关于如何处理它的建议。

简单调用"获取客户在其网络上的所有内容"返回的JSON对象返回大量信息,这些信息可以很容易地反序列化为一些计划旧对象,直到我在混合中发现这样的东西:

"Settings.Hosts.35.Active":"false","Settings.Hosts.17.Active":"false",

实际上我有一个大对象,它包含遵循命名约定的元素"Settings.Hosts.xx。活跃"、"Settings.Hosts.xx。MACAddress"等。

Cisco的文档充其量是粗略的(甚至缺乏对象定义),所以我想知道是否有一个最大的主机。我可以放心地依赖,或者是否有一种方法可以弯曲JSON。这将迫使这些编号元素成为一个集合(概念上)"设置。主机"{"MACAddress":"xx: xx: xx: xx: xx","活动":"false"}

我考虑过使用自定义解析器(JsonProperty装饰),但我一直没有找到这样的例子来复制。

如果将JSON字符串反序列化为JObject,则可以操作该对象来重建它。

// suppose your string deserialized into this structure
var obj = new JObject(
    new JProperty("Settings.Hosts.35.Active", false),
    new JProperty("Settings.Hosts.35.MACAddress", "xx:xx:xx:xx:xx"),
    new JProperty("Settings.Hosts.37.Active", false)
);
var re = new Regex(@"^Settings.Hosts.(d+).(w+)$");
var newObj = new JObject(
    new JProperty("Settings.Hosts",
        new JObject(
            from prop in obj.Cast<JProperty>()
            let m = re.Match(prop.Name)
            where m.Success
            let id = m.Groups[1].Value
            let propertyName = m.Groups[2].Value
            group new JProperty(propertyName, prop.Value) by id into g
            select new JProperty(g.Key, new JObject(g))
        )
    )
);

理想情况下,代码将在JsonConverter中。这将产生以下JSON字符串:

// before
{
  "Settings.Hosts.35.Active": false,
  "Settings.Hosts.35.MACAddress": "xx:xx:xx:xx:xx",
  "Settings.Hosts.37.Active": false
}
// after
{
  "Settings.Hosts": {
    "35": {
      "Active": false,
      "MACAddress": "xx:xx:xx:xx:xx"
    },
    "37": {
      "Active": false
    }
  }
}

最新更新