【问题标题】:converting graph api for xml为 xml 转换图形 api
【发布时间】:2012-12-02 17:48:06
【问题描述】:

我在转换 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 吗?
  • 正常是​​graph api facebook生成的json,这是我的代码生成的例子:jsfiddle.net/btripoloni/PaLC2

标签: c# xml facebook facebook-graph-api json.net


【解决方案1】:

下面提到的部分 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 版本等。

【讨论】:

    【解决方案2】:

    正如 keyr 所说,问题在于那些具有数字名称的 JSON 属性。在 XML 中,名称可以包含数字字符,但不能以 1 开头: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。这是具体要求吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2020-11-09
      相关资源
      最近更新 更多