将XElement转换为不带JSON的JObject,或者为空元素配置SerializeXNode

本文关键字:或者 元素 配置 JObject SerializeXNode 转换 XElement JSON | 更新日期: 2023-09-27 17:59:30

我正在使用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,但我不会被劝阻去寻找替代库或补充库,只要它们是免费的、小的,并且可以在.NET3.5中使用

1CCD_ 5的一般方法工作得很好。这里的问题是,标准的knockout.js模板绑定(与ko.mapping结合使用)不会"自动激活"结构,即使绑定到不存在的属性(在现有结构中)效果良好。

将XElement转换为不带JSON的JObject,或者为空元素配置SerializeXNode

如果你有更好的答案,就写出来。接受的答案可以更改。


好吧,我要说这在Json.NET.中是"不可能的"

我破解了Json.NET的XmlNodeConverter,它只与JsonReader和JsonWriter进行外部接口。

虽然写一个JObjectReader和一个JOobjectWriter是可能的,但这将涉及比我目前愿意投入的更多的工作。

或者,我可以复制所有的XmlNodeConverter代码(其中大部分是私有/内部的),并根据我的要求对其进行修改,但这种复制"粘贴"的大规模复制让我错了。

我现在拥有的东西已经足够好用了,即使看起来很浪费。