将JSON转换为具有无效节点名称的XML

时间:2015-07-09 12:16:49

标签: arrays json c#-4.0

我有以下JSON结构,从我无法更改的Web服务中检索到:

{
  "0": {
    "somedata": 0,
    "total": "137"
  },
  "1": {
    "somedata": 4,
    "total": "422"
  },
  etc...
}

使用JsonConvert.DeserializeXmlNode()会产生这个XmlDocument:

<ROOT>
  <0>
    <somedata>0</somedata>
    <total>137</total>
  </0>
  <!-- Etc... -->
<ROOT>

使用JsonConvert.DeserializeXNode()会导致异常,因为节点名称不能是数字。所以我需要一个更好的解串器,因为这两个转换对我来说都不适用 为了使它更复杂:我得到的JSON可能有嵌套数组,因此转换变得比预期的更复杂。如果Newtonsoft将验证它是否为数组元素生成有效名称,那将是很好的。不幸的是,我不需要解决这个问题 在我看来,这被认为是牛顿软件中的一个错误,但我不能等到它被修复。什么会解决这个问题?

使用JsonReaderWriterFactory.CreateJsonReader()我设法获得一个有效的XML文件,但它被命名空间“污染”。我不想要那些命名空间!它生成这样的东西:

<?xml version="1.0" encoding="utf-8"?>
<root type="object">
    <a:item xmlns:a="item" item="0" type="object">
        <somedata type="number">0</pages>
        <total type="string">847</total>
    </a:item>
</root>

虽然它是有效的,但命名空间使得另一个进程再次解析它变得更加复杂。

1 个答案:

答案 0 :(得分:1)

解决了!

        byte[] bytes = new byte[value.Length * sizeof(char)];
        Buffer.BlockCopy(value.ToCharArray(), 0, bytes, 0, bytes.Length);
        XmlReader reader = JsonReaderWriterFactory
            .CreateJsonReader(bytes, new XmlDictionaryReaderQuotas());
        result = XDocument.Load(reader);
        if (result.Root != null)
        {
            result
                .Root
                .Descendants()
                .Attributes()
                .Where(a => a.IsNamespaceDeclaration)
                .Remove();
            foreach (var descendant in result.Root.Descendants()) {
                descendant.Name = descendant.Name.LocalName; 
            }
        }

解决方案如下:JSON文本包含在值中。然后使用JsonReaderWriterFactory.CreateJsonReader()将此值转换为XML。然后删除所有属性名称空间的属性,并将所有元素名称更改为本地名称 这给了我想要的结果。