2

我正在为我的雇主构建一个 Cisco 的 ClearAccess 应用程序接口,我遇到了一些我觉得很奇怪的事情,想知道是否有人对如何处理它有建议。

从简单调用“获取客户网络上的所有内容”返回的 JSON 对象返回大量信息,这些信息可以很容易地反序列化为一些计划的旧对象,直到我在混合中找到类似的内容:

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

本质上,我有一个大对象,其中包含遵循“Settings.Hosts.xx.Active”、“Settings.Hosts.xx.MACAddress”等命名约定的元素。

Cisco 的文档充其量是粗略的(甚至缺少对象定义),所以我想知道是否有一个我可以安全依赖的最大 Host.xx,或者是否有一种方法可以让 JSON.NET 屈服于我的意愿,这将迫使这些编号元素到(概念上)“Settings.Host”{“MACAddress”:“xx:xx:xx:xx:xx”,“Active”:“false”}的集合中

我考虑过使用自定义解析器(JsonProperty 装饰),但我在找到要复制的示例方面相当不成功。

4

1 回答 1

0

如果将 JSON 字符串反序列化为 a 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
    }
  }
}
于 2013-06-15T09:54:57.257 回答