将JSON转换为XML,其中JSON键包含:这在XML中是不允许的

n8ghc7c1  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(128)

我的源JSON文件有:在下面提到的密钥中
"Dimension 4 : 4 : 4" : "4k TV"
我的JSON到XML转换器失败,因为这是不允许的,并引发此异常
System.Xml.XmlException: The ':' character, hexadecimal value 0x3A, cannot be included in a name.
如何将此JSON转换为有效的XML文件?
我已经尝试了正常的转换,但不起作用,这不应该被认为是命名空间,因为这不是命名空间,而只是一些文本。

e4eetjau

e4eetjau1#

您可以使用

使用encodeSpecialCharacters : true将JSON转换为XML:

var node = JsonConvert.DeserializeXNode(json, null, false, 
                                        encodeSpecialCharacters : true);

docs中所述,此参数为:
一个值,用于指示在将JSON转换为XML时是否对特殊字符进行编码。如果为true,则JSON属性名称中的特殊字符(如':'、'@'、'?'、'#'和'$')不会用于指定XML命名空间、属性或处理指令。相反,特殊字符将被编码并写入XML元素名称的一部分。
名称使用标准.NET方法XmlConvert.EncodeLocalName(String)编码,因此可以使用XmlConvert.DecodeName(String)恢复。
因此:

var json = """{"Dimension 4 : 4 : 4" : "4k TV"}""";

var node = JsonConvert.DeserializeXNode(json, null, false, 
                                        encodeSpecialCharacters : true);
foreach (var child in node.Descendants())
{
    var name = child.Name.LocalName;
    var originalName = XmlConvert.DecodeName(child.Name.LocalName);
    Console.WriteLine($"Encoded name: {name}"); //Dimension_x0020_4_x0020__x003A__x0020_4_x0020__x003A__x0020_4
    Console.WriteLine($"Original name: {originalName}"); //Dimension 4 : 4 : 4
}

图纸:

Encoded name: "Dimension_x0020_4_x0020__x003A__x0020_4_x0020__x003A__x0020_4"
Original name: "Dimension 4 : 4 : 4"

演示小提琴here

5m1hhzi4

5m1hhzi42#

假设你需要能够保存数据,我的方法是编写一些规范化API,删除无效字符(空格,无论你发现什么)或用其他标记替换它们,然后 * 如果名称和规范化名称不同 *,使用自定义xml命名空间中的属性(通常是别名),所以你最终得到:

<Dimension_4_4_4 mytool:name="Dimension 4 : 4 : 4"><!-- content --><Dimension_4_4_4>

然后根据需要反转该过程。
但是请注意,Dimension 4 : 4 : 4在json或xml含义中似乎是一个糟糕的名称。

相关问题