我在转换一串 json facebook graph api 时遇到问题,我使用了 facebook C# 和 json.Net。
但是在转换时它返回此错误:名称不能以'0'字符开头,十六进制值0x30。
这是代码:
dynamic result = await _fb.GetTaskAsync ("me / feed");
FBxml JsonConvert.DeserializeXNode string = (result.ToString ()). ToString ();
我在转换一串 json facebook graph api 时遇到问题,我使用了 facebook C# 和 json.Net。
但是在转换时它返回此错误:名称不能以'0'字符开头,十六进制值0x30。
这是代码:
dynamic result = await _fb.GetTaskAsync ("me / feed");
FBxml JsonConvert.DeserializeXNode string = (result.ToString ()). ToString ();
如下所述,部分 json 字符串似乎存在问题(取自您的链接http://jsfiddle.net/btripoloni/PaLC2/)
"story_tags": {
"0": [{
"id": "100000866891334",
"name": "Bruno Tripoloni",
"offset": 0,
"length": 15,
"type": "user"}]
},
Json 无法创建以“0”等数值开头的类。尝试使用链接http://json2csharp.com/创建类,你会明白的。
要解决此问题,您可以创建一个动态对象并遍历每个属性,或者创建一个JsonConverter
并在其中编写代码ReadJson
以将“0”转换为有意义的名称。可能这可以帮助你http://blog.maskalik.com/asp-net/json-net-implement-custom-serialization
如果这不是您的问题,则使用更多信息更新问题,例如 FBxml 的类结构、异常的调用堆栈(从哪一行 json 代码引发异常)、Json 版本等。
正如 keyr 所说,问题在于那些具有数字名称的 JSON 属性。在 XML 中,名称可以包含数字字符,但不能以一个开头:XML(请参阅格式正确和错误处理部分)。
我的想法是用 JSON.Net 递归解析 JSON,替换具有数字名称的属性:
var jsonObject = JObject.Parse(json);
foreach (var obj in jsonObject)
{
Process(obj.Value);
}
XDocument document = JsonConvert.DeserializeXNode(jsonObject.ToString());
....
private static void Process(JToken jToken)
{
if (jToken.Type == JTokenType.Property)
{
JProperty property = jToken as JProperty;
int value;
if (int.TryParse(property.Name, out value))
{
JToken token = new JProperty("_" + property.Name, property.Value);
jToken.Replace(token);
}
}
if (jToken.HasValues)
{
//foreach won't work here as the call to jToken.Replace(token) above
//results in the collection modifed error.
for(int i = 0; i < jToken.Values().Count(); i++)
{
JToken obj = jToken.Values().ElementAt(i);
Process(obj);
}
}
}
这似乎运作良好,在数字名称前加上_
. 在这一行:
XDocument document = JsonConvert.DeserializeXNode(jsonObject.ToString());
它因错误而崩溃,指出已创建无效/格式不正确的 XML。我没有实际的错误,但您可以运行上面的代码来复制它。
我认为从这里开始,您可能需要重新考虑将 JSON 转换为 XML。这是一个特定的要求吗?