我有以下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>
虽然它是有效的,但命名空间使得另一个进程再次解析它变得更加复杂。
答案 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。然后删除所有属性名称空间的属性,并将所有元素名称更改为本地名称 这给了我想要的结果。