2

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);

それでは(質問!);

  1. JSONを介したラウンドアバウトトリップをどのように回避できますか?
  2. そもそもXElementをJSONに変換する(特別なルールを適用する)より良い方法はありますか?

ノート:

  • 独自の 変換関数を(Json.NETと同じルール、またはコードを使用して)作成できることは承知していXElement->JObjectますが、可能であればライブラリサポートを再利用したいと思います。そもそもこれをやるべきだと思うなら、コメントを残してください。
  • Json.NETに固執したいのですが、無料で小さく、.NET 3.5で動作する限り、代替ライブラリまたは補足ライブラリを検討することを躊躇することはありません。

1の一般的なアプローチはknockout<-JSON<-WS(XML)->JSON->knockout非常にうまく機能します。ここでのこの問題は、(既存の構造内の)存在しないプロパティへのバインドが適切に機能していても、標準のknockout.jsテンプレートバインディング(と組み合わせてko.mapping)が構造を「自動活性化」しないことです

4

1 に答える 1

0

より良い答えがあれば、それを書いてください。受け入れた回答は変更できます。


さて、これはJson.NETでは「合理的に不可能」であると言うつもりです。

Json.NETのXmlNodeConverterをクラックして開きましたが、これはJsonReaderおよびJsonWriterと外部でのみインターフェースします。

JObjectReaderとJObjectWriterを作成すること可能であると思われますが、これには、私が現在投資したいと思っているよりも多くの作業が必要になります。

または、すべてのXmlNodeConverterコード(ほとんどがプライベート/内部)をコピーして、要件に応じて変更することもできますが、この種のコピーと貼り付けの一括複製は、私を間違ってこすります。

私が今持っているものは、たとえ無駄に見えても、十分に機能します。

于 2013-02-14T19:48:11.827 に答える