我正在使用 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,但只要它们是免费的、小型的并且在 .NET 3.5 中工作,就不会被劝阻查看替代或补充库。
1的一般方法knockout<-JSON<-WS(XML)->JSON->knockout
工作得很好。这里的问题是标准的 knockout.js 模板绑定(与 结合使用ko.mapping
)不会“自动激活”结构,即使绑定到不存在的属性(在现有结构内)效果很好。