XMLをJSONに変換するJson.NETの機能を使用していますが、これは非常にうまく機能します。(空のJSONオブジェクト)null
の代わりに空のXMLノードをマップするので、私は「かなりうまく」と言います。{}
ただし、このWebサービスの結果はknockout.jsバインディングを駆動{}
するため、バインディング構造を維持するためにマップする空のXML要素が必要です1。
現在のアプローチは次のようになります。
// Json.NET XML->JSON
// Can I specify any custom converters for this?
var json = Newtonsoft.Json.JsonConvert.SerializeXNode(xDoc);
// JSON->JObject
var jObject = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
// Update all `null` values to `{}`
// This "works reliably" because XML properties can never be null, but is
// hackish in its own right.
ConvertNullToEmptyObject(jObject as JContainer);
// And we're back at JSON, but I'd like to avoid such
// a complicated XML->JSON->JObject(Fixup)->JSON route.
// Performance isn't an issue, but it just feels dirty.
var finalJson = Newtonsoft.Json.JsonConvert.SerializeObject(jObject);
それでは(質問!);
- JSONを介したラウンドアバウトトリップをどのように回避できますか?
- そもそもXElementをJSONに変換する(特別なルールを適用する)より良い方法はありますか?
ノート:
- 独自の 変換関数を(Json.NETと同じルール、またはコードを使用して)作成できることは承知してい
XElement->JObject
ますが、可能であればライブラリサポートを再利用したいと思います。そもそもこれをやるべきだと思うなら、コメントを残してください。 - Json.NETに固執したいのですが、無料で小さく、.NET 3.5で動作する限り、代替ライブラリまたは補足ライブラリを検討することを躊躇することはありません。
1の一般的なアプローチはknockout<-JSON<-WS(XML)->JSON->knockout
非常にうまく機能します。ここでのこの問題は、(既存の構造内の)存在しないプロパティへのバインドが適切に機能していても、標準のknockout.jsテンプレートバインディング(と組み合わせてko.mapping
)が構造を「自動活性化」しないことです。