C# xml图形api的转换

C# xml图形api的转换,c#,xml,facebook,facebook-graph-api,json.net,C#,Xml,Facebook,Facebook Graph Api,Json.net,我在转换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字符

我在转换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字符串部分似乎有问题(取自您的链接)

Json无法创建以数字值(如“0”)开头的类。尝试使用链接创建类,你会有一个想法

要解决此问题,您可以创建一个动态对象并遍历每个属性,或者创建一个
JsonConverter
并将代码写入
ReadJson
中,以将“0”转换为有意义的名称。也许这对你有帮助


如果这不是您的问题,则使用更多信息更新问题,如FBxml的类结构、异常的调用堆栈(从json代码的哪一行引发异常)、json版本等。

正如keyr所说,问题在于那些具有数字名称的json属性。在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);
        }
    }
}
它崩溃了,错误是创建了无效/格式不正确的XML。我没有实际的错误,但是您可以运行上面的代码来复制它


我认为,从这里开始,您可能首先需要重新讨论如何将JSON转换为XML。这是一个特定的要求吗?

您可以发布您试图反序列化的JSON吗?正常是由graph api facebook生成的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());