我正在将BizTalk管道与JSON编码器一起使用,以将XML转换为JSON。 我已经创建了XSD,但是生成的JSON具有#text而不只是元素的值。
有什么想法我在做什么错吗?
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://BookingEngine.Schemas.JSONSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" name="affiliate_reference_id" type="xs:unsignedShort" />
<xs:element minOccurs="1" name="hold" type="xs:boolean" />
<xs:element minOccurs="1" maxOccurs="unbounded" name="rooms">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" name="email" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="1" maxOccurs="unbounded" name="payments">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" name="type" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="1" name="affiliate_metadata" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
转换为以下JSON
{
"affiliate_reference_id": {
"#text": "4480"
},
"hold": {
"#text": "false"
},
"rooms": [
{
"email": "john@example.com"
}
],
"payments": [
{
"type": "customer_card"
}
]
}
预期结果将是
{
"affiliate_reference_id": "4480",
"hold": "false",
"rooms": [
{
"email": "john@example.com"
}
],
"payments": [
{
"type": "customer_card"
}
]
}
知道为什么#text会弹出以及如何将其删除吗? 我需要在XSD架构中进行哪些更改?
答案 0 :(得分:1)
使用Newtonsoft时,我在c#中得到相同的结果。 #text节点的名称空间与根名称空间不同时,将添加#text节点,因为在JSON中,它成为具有文本和属性名称空间的对象。
答案 1 :(得分:0)
我添加了一个自定义biztalk管道并使用了json牛顿软nuget包。
答案 2 :(得分:0)
我使用JSON编码器创建了一个管道,并且遇到了同样的问题。
秘密在于,您需要在管道中的JSON编码器之前添加XML编码器。是的,很奇怪。
为所需的JSON结果创建具有正确数据类型的架构。将该架构添加到XML编码器文档架构属性。通过该架构,您可以控制JSON编码器的工作方式。
注意:XML需要一个根节点,而JSON则不需要。在您的JSON组装模式中,使用您喜欢的任何名称创建一个根节点。在JSON编码器中,有一个复选框可以删除包含有效负载的根节点。
JavaScript数据类型与XML(例如日期)不同,因此可能需要翻译。