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 文字列を に逆シリアル化すると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 に答える