带有数字的JSON.NET字段名称?

时间:2013-06-15 01:36:40

标签: c# json.net deserialization cisco

我正在为我的雇主构建思科ClearAccess应用程序的界面,我遇到了一些我觉得奇怪的事情,并想知道是否有人有关于如何处理它的建议。

JSON对象从一个简单的调用“让我了解客户在他们的网络中拥有的东西”回来后返回了大量的信息,这些信息很容易被反序列化为一些计划旧的对象,直到我发现这样的东西混合:

“Settings.Hosts.35.Active”: “假” 时, “Settings.Hosts.17.Active”: “假”,

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

文档最简单地来自思科(即使对象定义缺乏),所以我想知道是否有最大的Host.xx我可以放心使用,或者是否有办法让JSON.NET符合我的意愿这会强制这些编号的元素成为(概念上)“Settings.Host”{“MACAddress”:“xx:xx:xx:xx:xx”,“Active”:“false”}

的集合

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

1 个答案:

答案 0 :(得分:0)

如果将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
    }
  }
}