繁体   English   中英

用于ASP.NET 3.5的Facebook C#SDK的JSON对象转换错误

[英]JSON Object Casting Error with Facebook C# SDK for ASP.NET 3.5

我正在使用使用ASP.NET 3.5的Facebook C#SDK,并且从此处提供的示例代码库中收到其中一个调用的奇怪错误消息: http : //www.thepcwizard.in/2013/07/sample-app -using-facebook-c-sharp-sdk.html 这个示例是使用Facebook C#SDK进行FB登录代码的基础知识的出色演练,但是我有一个我似乎无法弄清的问题。

错误消息如下:

Server Error in '/' Application.

Unable to cast object of type 'Facebook.JsonArray' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidCastException: Unable to cast object of type 'Facebook.JsonArray' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]'.

Source Error: 

Line 271:        var athletes = (IDictionary<string, object>)me["favorite_athletes"];

Line 272:

Line 273:        foreach (var athlete in (JsonArray)athletes)

我已经按照说明编译了FB C#SDK版本3.5,并且大多数情况下都可以正常工作。 我必须将动态类型替换为var类型,并将其强制转换为IDictionary集合,因为ASP.NET 3.5不支持动态类型。 都好。 一切都很好,包括朋友列表的生成和显示,以及我所有的个人数据都被调用,但是最喜欢的运动员的调用导致了错误(下面的代码)。 我认为问题在于,有一个“数据”变量被称为好友列表,而这个“数据”变量未被称为运动员列表。 这是我所看到的返回JSON对象的方式的唯一区别。 该代码示例似乎通过在检索数据时删除“ data”变量来识别出这种情况,但是仍然没有遇到错误。

从Facebook返回的最喜欢的运动员JSON数据如下:

{
  "favorite_athletes": [
    {
      "id": "14185406833", 
      "name": "Serena Williams"
    }, 
    {
      "id": "61801828075", 
      "name": "Venus Williams"
    }, 
    {
      "id": "386180624733248", 
      "name": "Robert Griffin III"
    }, 
    {
      "id": "164825930120", 
      "name": "Tiger Woods"
    }, 
    {
      "id": "363865183112", 
      "name": "Floyd Mayweather"
    }, 
    {
      "id": "142603419139653", 
      "name": "Michael Vick"
    }, 
    {
      "id": "64637653943", 
      "name": "LeBron James"
    }
  ], 
  "id": "8723497347"
}

从Facebook返回的朋友列表数据如下(出于此问题的目的,虚假用户信息,因为我确实有4个以上的朋友:)):

{
  "id": "8723497347", 
  "friends": {
    "data": [
      {
        "name": "Friend 1", 
        "id": "1234567"
      }, 
      {
        "name": "Friend 2", 
        "id": "567965"
      }, 
      {
        "name": "Friend 3", 
        "id": "9847634"
      }, 
      {
        "name": "Friend 4", 
        "id": "100005000106091"
      }
    ], 
    "paging": {
      "next": "https://graph.facebook.com/8723497347/friends?limit=5000&offset=5000&__after_id=100005000106091"
    }
  }
}

引发错误的代码块如下:

private void GetUserData(string accessToken)
{
    var fb = new FacebookClient(accessToken);

    var me = (IDictionary<string, object>)fb.Get("me?fields=friends,name,email,favorite_athletes");

    string id = (string)me["id"]; // Store in database
    string email = (string)me["email"]; // Store in database
    string FBName = (string)me["name"]; // Store in database            

    NameText.Visible = true;
    NameText.Text = FBName;

    ViewState["FBName"] = FBName; // Storing User's Name in ViewState

    var friends = (IDictionary<string, object>)me["friends"];

    foreach (var friend in (JsonArray)friends["data"])
    {
        ListItem item = new ListItem((string)(((JsonObject)friend)["name"]), (string)(((JsonObject)friend)["id"]));
        FriendList.Items.Add(item);
    }

    var athletes = (IDictionary<string, object>)me["favorite_athletes"];

    foreach (var athlete in (JsonArray)athletes)
    {
        SportsPersonList.Items.Add((string)(((JsonObject)athlete)["name"]));
    }

    Login.Text = "Log Out";
}

任何建议,将不胜感激! 在此先感谢您的时间。

获取好友列表时,我们会收到一个JSONObject,然后再从该对象中提取JSONArray。 但是,在提取运动员时,“ favorite_athletes”本身会以JSONArray的形式返回,这就是为什么在转换为IDictionary对象时会存在强制转换异常的原因。 所以,

替换此代码

var athletes = (IDictionary<string, object>)me["favorite_athletes"];

foreach (var athlete in (JsonArray)athletes)
{
    SportsPersonList.Items.Add((string)(((JsonObject)athlete)["name"]));
}

有了这个

foreach (var athlete in (JsonArray)me["favorite_athletes"])
{
    SportsPersonList.Items.Add((string)(((JsonObject)athlete)["name"]));
}

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM