2

我正在使用 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);

那么(问题!);

  1. 如何避免通过 JSON 的迂回之旅?
  2. 有没有更好的方法将 XElement 转换为 JSON(应用特殊规则)?

笔记:

  • 我知道我可以编写自己的 XElement->JObject转换函数(使用与 Json.NET 相同的规则,甚至代码),但如果可能,我想重用库支持。如果您认为我应该一开始就这样做,请发表评论说。
  • 我想坚持使用 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 回答