c# - Newtonsoft.Json:当有附加属性时如何将 json 转换为 xml?
问题描述
- 我们创建一个匹配 json 的 xsd 模式
- 从 xsd 模式生成 ac# 类
- 使用newtonsoft.json将json反序列化为object和object to xml(基于生成的类)
这是必需的,因为我们使用的产品只能处理 xml 而不能处理 json。这适用于大多数 json 响应。
现在我们必须在传入的 json 中支持其他属性(任何)。所以我们创建了一个带有“ProcessContents = lax”的“Any”元素的xsd 模式。生成的类包含如下所示的任何元素。
public System.Xml.XmlElement Any
{
get { return this.anyField; }
set { this.anyField = value; }
}
以下是不同 Json 输入的行为。
- json 必须包含名称“Any”以匹配任何元素。这不满足附加属性的想法。
- 我可以添加一个“JsonProperty("SomeName")”,但我仍然应该知道我不知道的附加属性名称。
有人可以提供一种方法来做到这一点。谢谢。
Edit1: 在建议使用 JsonExtensionData 之后,该类看起来像这样。
我看到附加属性被反序列化为一个对象,如下图所示。 收到错误:“无法序列化 System.Collections.Generic.Dictionary`2 类型的成员 .AdditionalProperties [[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]],因为它实现了 IDictionary。"} 问:如何解决这个问题并将其序列化为 XmlAny 元素?谢谢。
解决方案
与其将 JSON 解析为 Object,然后将 Object 解析为 XML,为什么不直接使用 JSON -> XML?
Newtonsoft 提供了一种方法来做到这一点。
var node = JsonConvert.DeserializeXNode(jsonString, "Root");
https://www.newtonsoft.com/json/help/html/ConvertJsonToXml.htm
编辑:回读后,我意识到使用 XSD Schema 是一项业务需求。
推荐阅读
- python - 在pyspark中用整数编码一列
- java - 从 sqlite 数据库中选择日文字符
- optaplanner - Optaplanner 员工排班
- java - 为什么接口可以单独具有静态方法时不能具有静态初始化块?
- java - 如何在Java中比较两个HashMap
- c++ - C++ 在不同的文件中包含问题?(提升包括)
- angular - 使用 Angular Material (MatBottomSheet) 和 SSR 时的 AWS Lambda 超时
- python - Django 查找模板的 URL
- libgdx - 如何使主菜单屏幕首先显示(Libgdx)?
- python - 选择您的数字是分数还是小数