我正在使用Json.NET将XML转换为Json的能力,它运行得很好。我说"非常好"是因为它将把空的XML节点映射到null
,而不是{}
(空的JSON对象)。然而,由于这个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(应用特殊规则)
注:
- 我知道我可以编写自己的
XElement->JObject
转换函数(使用与Json.NET相同的规则,甚至代码),但如果可能的话,我希望重用库支持。如果你认为我应该先这么做,请留言 - 我想坚持使用Json.NET,但我不会被劝阻去寻找替代库或补充库,只要它们是免费的、小的,并且可以在.NET3.5中使用
1CCD_ 5的一般方法工作得很好。这里的问题是,标准的knockout.js模板绑定(与ko.mapping
结合使用)不会"自动激活"结构,即使绑定到不存在的属性(在现有结构中)效果良好。
如果你有更好的答案,就写出来。接受的答案可以更改。
好吧,我要说这在Json.NET.中是"不可能的"
我破解了Json.NET的XmlNodeConverter,它只与JsonReader和JsonWriter进行外部接口。
虽然写一个JObjectReader和一个JOobjectWriter是可能的,但这将涉及比我目前愿意投入的更多的工作。
或者,我可以复制所有的XmlNodeConverter代码(其中大部分是私有/内部的),并根据我的要求对其进行修改,但这种复制"粘贴"的大规模复制让我错了。
我现在拥有的东西已经足够好用了,即使看起来很浪费。