C# JsonConvert.DeserializeXmlNode异常-名称中不能有冒号(:)
我需要使用NewtonSoft JSON.Net将JSON转换为XML。JSON文件在一些对象键中包含带有冒号的数据。当运行下面的代码时,它抛出一个异常C# JsonConvert.DeserializeXmlNode异常-名称中不能有冒号(:),c#,asp.net,xml,json,json.net,C#,Asp.net,Xml,Json,Json.net,我需要使用NewtonSoft JSON.Net将JSON转换为XML。JSON文件在一些对象键中包含带有冒号的数据。当运行下面的代码时,它抛出一个异常 XmlDocument xdoc = JsonConvert.DeserializeXmlNode(json, "root"); 例外情况:名称中不能包含十六进制值0x3A的“:”字符。 以下是JSON字符串中的一些键值对示例: 'jcr:type' : 'nt:file'; 'jcr:content' ['jcr:uuid' : jfkjs
XmlDocument xdoc = JsonConvert.DeserializeXmlNode(json, "root");
例外情况:名称中不能包含十六进制值0x3A的“:”字符。
以下是JSON字符串中的一些键值对示例:
'jcr:type' : 'nt:file';
'jcr:content' ['jcr:uuid' : jfkjsaf]
这些是从JSON字符串中随机选取的;键和值都有带冒号的前缀
如何让Json.Net忽略此异常并将Json转换为XML
好的,这是我的json文件
{
"jcr:createdBy": "admin",
"jcr:created": "Mon Dec 30 2013 23:31:17 GMT-0800",
"jcr:primaryType": "sling:OrderedFolder",
"CustomerImage0": {
"id": 0,
"firstName": "Customer",
"state": "Andhra Pradesh",
"phone": "988-777-5550",
"status": "Active",
"lastName": "Image",
"country": "India",
"jcr:primaryType": "nt:unstructured"
},
"CustomerImage1": {
"id": 1,
"firstName": "Customer",
"state": "Andhra Pradesh",
"phone": "988-777-5551",
"status": "Active",
"lastName": "Image",
"country": "India",
"jcr:primaryType": "nt:unstructured"
},
"CustomerImage2": {
"id": 2,
"firstName": "Customer",
"state": "Andhra Pradesh",
"phone": "988-777-5552",
"status": "Active",
"lastName": "Image",
"country": "India",
"jcr:primaryType": "nt:unstructured"
},
"CustomerImage3": {
"id": 3,
"firstName": "Customer",
"state": "Andhra Pradesh",
"phone": "988-777-5553",
"status": "Active",
"lastName": "Image",
"country": "India",
"jcr:primaryType": "nt:unstructured"
},
"CustomerImage4": {
"id": 4,
"firstName": "Customer",
"state": "Andhra Pradesh",
"phone": "988-777-5554",
"status": "Active",
"lastName": "Image",
"country": "India",
"jcr:primaryType": "nt:unstructured"
},
"Nokia_7610_white.gif": {
"jcr:uuid": "65ce7b11-c5f1-4017-b27c-c455b1a710a1",
"jcr:createdBy": "admin",
"jcr:mixinTypes": [
"mix:referenceable"
],
"jcr:created": "Fri Jan 03 2014 04:58:12 GMT-0800",
"jcr:primaryType": "nt:file",
"jcr:content": {
"firstName": "Vendor",
"companyName": "E Z Systems",
":jcr:data": 11886,
"phone": "888-123-0121",
"status": "Active",
"jcr:mimeType": "image/gif",
"designation": "APL",
"lastName": "Image1",
"jcr:lastModified": "Fri Jan 03 2014 04:57:59 GMT-0800",
"jcr:primaryType": "nt:unstructured",
"city": "Hyderabad"
}
},
"Nokia_9300_close.gif": {
"jcr:uuid": "619ee9eb-d73a-4a65-b7e7-8bd5c2061412",
"jcr:createdBy": "admin",
"jcr:mixinTypes": [
"mix:referenceable"
],
"jcr:created": "Fri Jan 03 2014 04:59:22 GMT-0800",
"jcr:primaryType": "nt:file",
"jcr:content": {
"firstName": "Vendor",
"companyName": "E Z Systems",
":jcr:data": 11797,
"phone": "888-123-0122",
"status": "Active",
"jcr:mimeType": "image/gif",
"designation": "APL",
"lastName": "Image2",
"jcr:lastModified": "Fri Jan 03 2014 04:59:09 GMT-0800",
"jcr:primaryType": "nt:unstructured",
"city": "Hyderabad"
}
},
"Nokia_9500_close.gif": {
"jcr:uuid": "12a67241-aa11-4199-9b98-657406d777d6",
"jcr:createdBy": "admin",
"jcr:mixinTypes": [
"mix:referenceable"
],
"jcr:created": "Fri Jan 03 2014 05:00:13 GMT-0800",
"jcr:primaryType": "nt:file",
"jcr:content": {
"firstName": "Vendor",
"companyName": "E Z Systems",
":jcr:data": 9873,
"phone": "888-123-0123",
"status": "Active",
"jcr:mimeType": "image/gif",
"designation": "APL",
"lastName": "Image3",
"jcr:lastModified": "Fri Jan 03 2014 05:00:00 GMT-0800",
"jcr:primaryType": "nt:unstructured",
"city": "Hyderabad"
}
},
"Nokia_N90.gif": {
"jcr:uuid": "5a01d557-1430-4d5b-a9f8-5f836f2812a7",
"jcr:createdBy": "admin",
"jcr:mixinTypes": [
"mix:referenceable"
],
"jcr:created": "Fri Jan 03 2014 05:00:57 GMT-0800",
"jcr:primaryType": "nt:file",
"jcr:content": {
"firstName": "Vendor",
"companyName": "E Z Systems",
":jcr:data": 8841,
"phone": "888-123-0124",
"status": "Active",
"jcr:mimeType": "image/gif",
"designation": "APL",
"lastName": "Image4",
"jcr:lastModified": "Fri Jan 03 2014 05:00:44 GMT-0800",
"jcr:primaryType": "nt:unstructured",
"city": "Hyderabad"
}
},
"PreviewGif.gif": {
"jcr:uuid": "625112c6-dede-4333-8e78-fcdf474a190f",
"jcr:createdBy": "admin",
"jcr:mixinTypes": [
"mix:referenceable"
],
"jcr:created": "Thu Jan 09 2014 05:19:39 GMT-0800",
"jcr:primaryType": "nt:file",
"jcr:content": {
"firstName": "Vendor",
"companyName": "E Z Systems",
":jcr:data": 26994,
"phone": "888-123-0125",
"status": "Active",
"designation": "APL",
"jcr:mimeType": "image/gif",
"lastName": "Image5",
"jcr:lastModified": "Thu Jan 09 2014 05:19:27 GMT-0800",
"jcr:primaryType": "nt:unstructured",
"city": "Hyderabad"
}
},
"online.png": {
"jcr:uuid": "194f27d0-a549-493f-9c67-ac8f1ea436a5",
"jcr:createdBy": "admin",
"jcr:mixinTypes": [
"mix:referenceable"
],
"jcr:created": "Thu Jan 09 2014 05:23:09 GMT-0800",
"jcr:primaryType": "nt:file",
"jcr:content": {
"firstName": "Vendor",
"companyName": "E Z Systems",
":jcr:data": 1857,
"phone": "888-123-0126",
"status": "Active",
"designation": "APL",
"jcr:mimeType": "image/png",
"lastName": "Image6",
"jcr:lastModified": "Thu Jan 09 2014 05:22:58 GMT-0800",
"jcr:primaryType": "nt:unstructured",
"city": "Hyderabad"
}
},
"Hot_Sale_Nike.pdf": {
"jcr:uuid": "52084540-b409-45cd-909b-9702742428b1",
"jcr:createdBy": "admin",
"jcr:mixinTypes": [
"mix:referenceable"
],
"jcr:created": "Fri Jan 10 2014 01:30:48 GMT-0800",
"jcr:primaryType": "nt:file",
"jcr:content": {
"firstName": "Vendor",
"companyName": "E Z Systems",
":jcr:data": 54909,
"phone": "888-123-0222",
"status": "Active",
"designation": "APL",
"jcr:mimeType": "application/pdf",
"lastName": "Pdf2",
"jcr:lastModified": "Fri Jan 10 2014 01:30:32 GMT-0800",
"jcr:primaryType": "nt:unstructured",
"city": "Hyderabad"
}
}
}
你确定你的JSON格式正确吗?在将您提供的示例设置为正确格式的JSON后,我使用最新版本的JSON.Net尝试了以下代码。我没有看到任何将其转换为XML的异常。在转换过程中,Json.Net似乎通过从键中删除前缀来处理冒号
class Program
{
static void Main(string[] args)
{
string json = @"
{
""jcr:type"" : ""nt:file"",
""jcr:content"" : [""jcr:uuid"", ""jfkjsaf""]
}";
XmlDocument xdoc = JsonConvert.DeserializeXmlNode(json, "root");
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
using (XmlTextWriter writer = new XmlTextWriter(sw))
{
writer.Formatting = System.Xml.Formatting.Indented;
xdoc.WriteTo(writer);
}
Console.WriteLine(sb.ToString());
}
}
输出:
<root>
<type>nt:file</type>
<content>jcr:uuid</content>
<content>jfkjsaf</content>
</root>
看起来问题密钥都是相同的--:jcr:data
。如果您可以控制JSON的源代码,那么最好的解决方案是修复源代码,使其在这些键的开头没有额外的冒号
如果JSON来自您不控制的第三方web服务,一个简单的修复方法是在尝试将JSON转换为XML之前对其进行字符串替换。您可以这样做:
json = json.Replace(":jcr:data", "jcr:data");
我用你的完整JSON尝试了这一点,效果很好。谢谢你的回复,我验证了我的JSON文件,它是有效的,我收到的错误是:名称中不能包含“:”字符,十六进制值0x3A。部分JSON数据“online.png”:{“jcr:uuid”:“194f27d0-a549-493f-9c67-ac8f1ea436a5”,“jcr:createdBy”:“admin”,“jcr:mixinTypes”:[“mix:referenceable”],“jcr:created”:“Thu Jan 09 2014 05:23:09 GMT-0800”,“jcr:primaryType”:“nt:file”,“jcr:content”:{“firstName”:“Vendor”,“companyName”:“EZ Systems”;“jcr:data”:1857,“phone”:“888-123-0126”,“status”:“Active”,“指定”:“APL”,“jcr:mimeType”:“image/png”,“lastName”:“Image6”jcr:lastModified:“Thu Jan 09 2014 05:22:58 GMT-0800”,“jcr:primaryType:“nt:非结构化”,“城市”:“海得拉巴”},是否可以使用linq查询jobject,并在任何深度进行类似的键值和数组名称搜索?如果可以,请帮助我编写查询,这样,我就不必担心从json转换xml,然后在转换后的xml上使用xpath来执行搜索操作。json文件没有根元素,它以多个属性和我发布了一个关于图像的元数据集合,在JsonSerializerInternalReader.cs文件中,在deserializedValue=CreateValueInternal(reader、objectType、contract、null、null、null、null)处抛出一个示例图像元数据异常
json = json.Replace(":jcr:data", "jcr:data");