c# - 带数字的 JSON.NET 字段名称?

标签 c# json.net deserialization cisco

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

从简单调用“获取客户在他们的网络上拥有的所有内容”返回的 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 装饰),但我一直没有成功找到要复制的示例。

最佳答案

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

关于c# - 带数字的 JSON.NET 字段名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17119420/

相关文章:

c# - IEnumerable 作为流发出?

C# - 查找适用的前缀

c# - Json.net 上的反序列化更改属性类型和名称

Java反序列化旧对象

swift - 使用两个类创建协议(protocol)

java - 如何根据json中的属性编写jackson反序列化器

c# - 按钮触发事件不适用于边框?

使用 javaScript 和 html 的 C# WebBrowser 控件

c# - 在 JSON 文件中追加对象的最佳方式?

javascript - 在 ASP.NET MVC 中将值从下拉列表传递到数据库