C# 避免<;项目类型>;从JSON创建节点到C中的XML转换器#

C# 避免<;项目类型>;从JSON创建节点到C中的XML转换器#,c#,.net,json,xml,C#,.net,Json,Xml,我们正在尝试使用以下C#代码将JSON转换为XML: 示例json是: [ { "id" : 21953, "mainReqIdentity" : "xxxx", "itemName" : "xxxx", "kanbanPhase" : "xxxx", "kanbanStatus" : "xxxx", "backlogItemType" : "xxxx", "identityDomai

我们正在尝试使用以下C#代码将JSON转换为XML:

示例json是:

[
{
        "id" : 21953,
        "mainReqIdentity" : "xxxx",
        "itemName" : "xxxx",
        "kanbanPhase" : "xxxx",
        "kanbanStatus" : "xxxx",
        "backlogItemType" : "xxxx",
        "identityDomain" : "xxxx",
        "fromDatetime" : "2016-08-05 17:52:34",
        "teams" : [],
        "releases" : [{
                "id" : 1229,
                "release_name" : "xxxx",
                "release_connection_type" : "xxxx"
            }
        ],
        "fpReleases" : [],
        "sources" : [{
                "sourceName" : "xxxx",
                "sourceRecordUrl" : "xxxx",
                "sourceRecordIdentity" : "xxxx"
            }
        ],
        "productNumbers" : [],
        "tags" : [],
        "productComponents" : [],
        "ranPlatforms" : [],
        "subReleases" : [],
        "requirementAreaId" : "xxxx",
        "requirementArea" : "xxxx",
        "toBeHandledAtxxxx" : "xxxx"
    }, {
        "id" : 22014,
        "mainReqIdentity" : "xxxx",
        "itemName" : "xxxx",
        "kanbanPhase" : "xxxx",
        "kanbanStatus" : "xxxx",
        "backlogItemType" : "xxxx",
        "identityDomain" : "xxxx",
        "fromDatetime" : "2016-08-05 17:52:34",
        "teams" : [],
        "releases" : [{
                "id" : "xxxx",
                "release_name" : "xxxx",
                "release_connection_type" : "xxxx"
            }
        ],
        "fpReleases" : [],
        "sources" : [{
                "sourceName" : "xxxx",
                "sourceRecordUrl" : "xxxx",
                "sourceRecordIdentity" : "xxxx"
            }
        ],
        "productNumbers" : [],
        "tags" : [],
        "productComponents" : [],
        "ranPlatforms" : [],
        "subReleases" : [],
        "requirementAreaId" : "xxxx",
        "requirementArea" : "xxxx",
        "f0Date" : "2015-10-01",
        "f1Date" : "2015-10-01",
        "f2Date" : "2016-02-01",
        "f4Date" : "2016-03-31",
        "fgDate" : "2016-04-29",
        "toBeHandledAtxxxx" : "xxxx"
    }
    ]
转换后,XML看起来像:

    <root type="array">
    <id type="number">21286</id>
    <mainReqIdentity type="string">xxxxxx</mainReqIdentity>
    <itemName type="string">xxxxxx</itemName>
    <kanbanPhase type="string">xxxxxx</kanbanPhase>
    <kanbanStatus type="string">xxxxxx</kanbanStatus>
    <kanbanNote type="string">xxxxxx</kanbanNote>
    <backlogItemType type="string">xxxxxx</backlogItemType>
    <identityDomain type="string">xxxxxx</identityDomain>
    <fromDatetime type="string">2016-08-23 17:01:52</fromDatetime>
    <teams type="array">
      <item type="object">
        <team_name type="string">xxxxxx</team_name>
        <preliminary type="boolean">xxxxxx</preliminary>
      </item>
    </teams>
    <releases type="array">
      <item type="object">
        <id type="number">xxxxxx</id>
        <release_name type="string">xxxxxx</release_name>
        <release_connection_type type="string">xxxxxx</release_connection_type>
      </item>
    </releases>
    <fpReleases type="array">
    </fpReleases>
    <sources type="array">
      <item type="object">
        <sourceName type="string">xxxxxx</sourceName>
        <sourceRecordUrl type="string">xxxxxx</sourceRecordUrl>
      </item>
    </sources>
    <productNumbers type="array">
    </productNumbers>
    <tags type="array">
    </tags>
    <productComponents type="array">
    </productComponents>
    <ranPlatforms type="array">
    </ranPlatforms>
    <subReleases type="array">
    </subReleases>
    <requirementAreaId type="number">xxxxxx</requirementAreaId>
    <requirementArea type="string">xxxxxx</requirementArea>
    <itemContact type="string">xxxxxx</itemContact>
    <toBeHandledAtxxx type="string">xxxxxx</toBeHandledAtxxx>
  </item>
    <item type="object">
    <id type="number">xxxxxx</id>
    <mainReqIdentity type="string">xxxxxx</mainReqIdentity>
    <itemName type="string">xxxxxx</itemName>
    <kanbanPhase type="string">xxxxxx</kanbanPhase>
    <kanbanStatus type="string">xxxxxx</kanbanStatus>
    <kanbanNote type="string">xxxxxx</kanbanNote>
    <backlogItemType type="string">xxxxxx</backlogItemType>
    <identityDomain type="string">xxxxxx</identityDomain>
    <fromDatetime type="string">2016-08-23 17:01:52</fromDatetime>
    <teams type="array">
      <item type="object">
        <team_name type="string">xxxxxx</team_name>
        <preliminary type="boolean">xxxxxx</preliminary>
      </item>
    </teams>
    <releases type="array">
      <item type="object">
        <id type="number">xxxxxx</id>
        <release_name type="string">xxxxxx</release_name>
        <release_connection_type type="string">xxxxxx</release_connection_type>
      </item>
    </releases>
    <fpReleases type="array">
    </fpReleases>
    <sources type="array">
      <item type="object">
        <sourceName type="string">xxxxxx</sourceName>
        <sourceRecordUrl type="string">xxxxxx</sourceRecordUrl>
      </item>
    </sources>
    <productNumbers type="array">
    </productNumbers>
    <tags type="array">
    </tags>
    <productComponents type="array">
    </productComponents>
    <ranPlatforms type="array">
    </ranPlatforms>
    <subReleases type="array">
    </subReleases>
    <requirementAreaId type="number">xxxxxx</requirementAreaId>
    <requirementArea type="string">xxxxxx</requirementArea>
    <oaResultReference type="string">xxxxxx</oaResultReference>
    <itemContact type="string">xxxxxx</itemContact>
    <f0Date type="string">2014-10-17</f0Date>
    <f1Date type="string">2015-01-16</f1Date>
    <f2Date type="string">2015-02-13</f2Date>
    <f4Date type="string">2015-06-12</f4Date>
    <faDate type="string">2015-06-12</faDate>
    <fgDate type="string">2015-06-12</fgDate>
    <toBeHandledAtxxx type="string">xxxxxx</toBeHandledAtxxx>
  </item>
 </root>

21286
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
2016-08-23 17:01:52
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
2016-08-23 17:01:52
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
xxxxxx
2014-10-17
2015-01-16
2015-02-13
2015-06-12
2015-06-12
2015-06-12
xxxxxx

如果您在创建每个节点之前观察到一个项目类型。我的问题是如何避免从C类创建它们。

中描述了JsonReaderWriterFactory使用的XML和JSON之间的对应关系。特别是:

  • 由于XML没有数组原语的概念,JSON数组被映射到两个XML级别,其中内部元素的[local name]将是“item”

  • 每个元素都添加了一个属性
    “type”
    。如文档中所述,此属性用于在映射的XML中保留JSON类型(字符串、数字、布尔值、对象、数组或null)

如果此映射不满足您的需要,您可以在存储XML之前使用一些适当的API(例如,或修改)自定义生成的XML

例如,API取代了.NET3.5中的
XmlDocument
API,允许在内存中轻松修改XML。首先,按如下方式将JSON加载到

XDocument xd;
using (var xr = JsonReaderWriterFactory.CreateJsonReader(webdata, XmlDictionaryReaderQuotas.Max))
{
    xd = XDocument.Load(xr);
}
现在,如果您想从外部容器元素“取消嵌套”数组项,可以按如下操作-根元素除外。如果XML文档的属性对应于JSON数组,则无法冒泡出其项,因为这样做会违反每个XML文档必须具有的规则。话虽如此,以下各项应能发挥作用:

foreach (var arrayElement in xd.Root.Descendants().Where(e => (string)e.Attribute("type") == "array").ToList())
{
    // Get all child nodes of the array container node.
    var nodes = arrayElement.Nodes().ToList();
    bool anyChildren = false;
    // Change names of child elements from <item> to the name of the container node, <releases> or whatever.
    foreach (var element in nodes.OfType<XElement>())
    {
        anyChildren = true;
        element.Name = arrayElement.Name;
    }
    if (anyChildren)
    {
        // Remove all its child nodes.
        nodes.Remove();
        // Add formerly child nodes right after the container node.
        arrayElement.AddAfterSelf(nodes);
        // Remove the container node itself.
        arrayElement.Remove();
    }
}
最后,要在以后保存文档,请执行以下操作:

xd.Save("\\Server\\ZZZZ\\Downloads\\Data.xml");
将这两个转换链接起来的结果是:

<root>
  <item>
    <id>21953</id>
    <mainReqIdentity>xxxx</mainReqIdentity>
    <itemName>xxxx</itemName>
    <kanbanPhase>xxxx</kanbanPhase>
    <kanbanStatus>xxxx</kanbanStatus>
    <backlogItemType>xxxx</backlogItemType>
    <identityDomain>xxxx</identityDomain>
    <fromDatetime>2016-08-05 17:52:34</fromDatetime>
    <teams></teams>
    <releases>
      <id>1229</id>
      <release_name>xxxx</release_name>
      <release_connection_type>xxxx</release_connection_type>
    </releases>
    <fpReleases></fpReleases>
    <sources>
      <sourceName>xxxx</sourceName>
      <sourceRecordUrl>xxxx</sourceRecordUrl>
      <sourceRecordIdentity>xxxx</sourceRecordIdentity>
    </sources>
    <productNumbers></productNumbers>
    <tags></tags>
    <productComponents></productComponents>
    <ranPlatforms></ranPlatforms>
    <subReleases></subReleases>
    <requirementAreaId>xxxx</requirementAreaId>
    <requirementArea>xxxx</requirementArea>
    <toBeHandledAtxxxx>xxxx</toBeHandledAtxxxx>
  </item>
  <item>
    <id>22014</id>
    <mainReqIdentity>xxxx</mainReqIdentity>
    <itemName>xxxx</itemName>
    <kanbanPhase>xxxx</kanbanPhase>
    <kanbanStatus>xxxx</kanbanStatus>
    <backlogItemType>xxxx</backlogItemType>
    <identityDomain>xxxx</identityDomain>
    <fromDatetime>2016-08-05 17:52:34</fromDatetime>
    <teams></teams>
    <releases>
      <id>xxxx</id>
      <release_name>xxxx</release_name>
      <release_connection_type>xxxx</release_connection_type>
    </releases>
    <fpReleases></fpReleases>
    <sources>
      <sourceName>xxxx</sourceName>
      <sourceRecordUrl>xxxx</sourceRecordUrl>
      <sourceRecordIdentity>xxxx</sourceRecordIdentity>
    </sources>
    <productNumbers></productNumbers>
    <tags></tags>
    <productComponents></productComponents>
    <ranPlatforms></ranPlatforms>
    <subReleases></subReleases>
    <requirementAreaId>xxxx</requirementAreaId>
    <requirementArea>xxxx</requirementArea>
    <f0Date>2015-10-01</f0Date>
    <f1Date>2015-10-01</f1Date>
    <f2Date>2016-02-01</f2Date>
    <f4Date>2016-03-31</f4Date>
    <fgDate>2016-04-29</fgDate>
    <toBeHandledAtxxxx>xxxx</toBeHandledAtxxxx>
  </item>
</root>

21953
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
2016-08-05 17:52:34
1229
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
22014
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
2016-08-05 17:52:34
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
2015-10-01
2015-10-01
2016-02-01
2016-03-31
2016-04-29
xxxx

您想要什么,您正在以
词典的形式阅读它
?如果您创建一个硬编码的dto类来读取JSON并使用它来序列化输出,那么您就不会有这个问题。但是你会被束缚在一个(某种程度上)固定的结构上。你现在序列化它的方式是,它添加了类型,这样它就有可能在以后取消序列化。或者我是c#新手,你能给我一个示例代码吗?最后的问题是,你希望它如何序列化。我可以想象,如果在每个节点创建一个项类型之前都观察到,您可能希望简化您编写的XML序列化。这是不对的。为每个元素创建一个
type=
属性。将为每个数组项创建一个
节点,但不是为每个节点。你想阻止或消除哪一个?发送承诺,让我试试,给我一两天时间
xd.Save("\\Server\\ZZZZ\\Downloads\\Data.xml");
<root>
  <item>
    <id>21953</id>
    <mainReqIdentity>xxxx</mainReqIdentity>
    <itemName>xxxx</itemName>
    <kanbanPhase>xxxx</kanbanPhase>
    <kanbanStatus>xxxx</kanbanStatus>
    <backlogItemType>xxxx</backlogItemType>
    <identityDomain>xxxx</identityDomain>
    <fromDatetime>2016-08-05 17:52:34</fromDatetime>
    <teams></teams>
    <releases>
      <id>1229</id>
      <release_name>xxxx</release_name>
      <release_connection_type>xxxx</release_connection_type>
    </releases>
    <fpReleases></fpReleases>
    <sources>
      <sourceName>xxxx</sourceName>
      <sourceRecordUrl>xxxx</sourceRecordUrl>
      <sourceRecordIdentity>xxxx</sourceRecordIdentity>
    </sources>
    <productNumbers></productNumbers>
    <tags></tags>
    <productComponents></productComponents>
    <ranPlatforms></ranPlatforms>
    <subReleases></subReleases>
    <requirementAreaId>xxxx</requirementAreaId>
    <requirementArea>xxxx</requirementArea>
    <toBeHandledAtxxxx>xxxx</toBeHandledAtxxxx>
  </item>
  <item>
    <id>22014</id>
    <mainReqIdentity>xxxx</mainReqIdentity>
    <itemName>xxxx</itemName>
    <kanbanPhase>xxxx</kanbanPhase>
    <kanbanStatus>xxxx</kanbanStatus>
    <backlogItemType>xxxx</backlogItemType>
    <identityDomain>xxxx</identityDomain>
    <fromDatetime>2016-08-05 17:52:34</fromDatetime>
    <teams></teams>
    <releases>
      <id>xxxx</id>
      <release_name>xxxx</release_name>
      <release_connection_type>xxxx</release_connection_type>
    </releases>
    <fpReleases></fpReleases>
    <sources>
      <sourceName>xxxx</sourceName>
      <sourceRecordUrl>xxxx</sourceRecordUrl>
      <sourceRecordIdentity>xxxx</sourceRecordIdentity>
    </sources>
    <productNumbers></productNumbers>
    <tags></tags>
    <productComponents></productComponents>
    <ranPlatforms></ranPlatforms>
    <subReleases></subReleases>
    <requirementAreaId>xxxx</requirementAreaId>
    <requirementArea>xxxx</requirementArea>
    <f0Date>2015-10-01</f0Date>
    <f1Date>2015-10-01</f1Date>
    <f2Date>2016-02-01</f2Date>
    <f4Date>2016-03-31</f4Date>
    <fgDate>2016-04-29</fgDate>
    <toBeHandledAtxxxx>xxxx</toBeHandledAtxxxx>
  </item>
</root>