0

我正在使用 MonoTouch 框架开发 iOS 应用程序。我正在使用带有 Xamarin.iOS (v1.3.250) 扩展的 Visual Studio 2010 Professional SP1。我已经能够FacebookConnect.FBSession通过使用没有问题打开一个有效的,但是当我尝试使用我收到一个非标准的 JSON 样式字符串FacebookConnect.FBLoginView来发出 Graph API 请求时。当我通过Graph API ExplorerFacebookConnect.FBRequest运行以下请求时:

me?fields=albums.fields(id,name,cover_photo)

我收到以下回复:

{
  "id": "111111111111111111", 
  "albums": {
    "data": [
      {
        "id": "111111111111111111", 
        "name": "Some Album (#1)", 
        "cover_photo": "111111111111111111", 
        "created_time": "000-00-00T00:00:00+0000"
      }, 
      {
        "id": "111111111111111111", 
        "name": "Some Album (#2)", 
        "cover_photo": "111111111111111111", 
        "created_time": "000-00-00T00:00:00+0000"
      }, 
    ], 
    "paging": {
      "cursors": {
        "after": "xxxxxxxx=", 
        "before": "xxxxxxxx="
      }
    }
  }
}

现在所有这一切都很好,并且是我期望收到的,但是当我从我的应用程序发出相同的 Graph API 请求时,如下所示:

public static void GetPhotoAlbums(string _userID)
{
    // _userID = "me"
    mFBRequest = new FBRequest(FBSession.ActiveSession, _userID + "?fields=albums.fields(id,name,cover_photo)");
    FBRequestConnection fbRequestConnection = new FBRequestConnection();
    fbRequestConnection.AddRequest(mFBRequest, OnPhotoAlbumsReceived);
    fbRequestConnection.Start();
}

static void OnPhotoAlbumsReceived(FBRequestConnection _connection, NSObject _result, NSError _error)
{
    if (_error == null)
    {
        Console.WriteLine("FacebookManager.OnPhotoAlbumsReceived() - JSON: " + _result.Description);
        object o = JsonConvert.DeserializeObject(_result.Description);
        // ...
    }
}

我收到这个 JSON 'like' 响应:

{
    albums =     {
        data =         (
                        {
                "cover_photo" = 111111111111111111;
                "created_time" = "000-00-00T00:00:00+0000";
                id = 111111111111111111;
                name = "Some Album (#1)";
            },
                        {
                "cover_photo" = 111111111111111111;
                "created_time" = "000-00-00T00:00:00+0000";
                id = 111111111111111111;
                name = "Some Album (#2)";
            },
        );
        paging =         {
            cursors =             {
                after = "xxxxxxxx=";
                before = "xxxxxxxx=";
            };
        };
    };
    "id": "111111111111111111";
}

我不确定我如何/为什么会得到以非标准方式格式化的响应,但不用说,我Newtonsoft.Json.JsonReaderException在尝试反序列化数据时得到,因为它不遵循标准格式规则(即,而=不是:分开的键/值对,;而不是,分开容器的元素,一些键有引号,而另一些键没有,等等......)

总的来说,我对 Facebook 和 JSON 的东西还很陌生,我对收到的响应字符串的情况感到非常茫然。非常感谢任何帮助、反馈和想法。谢谢。

4

2 回答 2

1

* 解决方案 *

经过一堆挖掘之后,似乎 Graph API 响应确实是 JSON,但它被转换为一个FBGraphObject保存 aNSMutableArray因为它的数据通过 MonoTouch-> .NET 绑定所以当我拉的时候_result.Description(相当于_result.ToString()它返回给我该对象的字符串表示,它恰好看起来很像 JSON,但不是。在找出所有这些(以及大量运行时实验)之后,我终于能够通过这样做将数据提取到可用状态:

static void OnPhotoAlbumsReceived(FBRequestConnection _connection, NSObject _result, NSError _error)
{
    if (_error == null)
    {
        NSArray fieldData = (NSArray) _result.ValueForKeyPath(new NSString("albums.data.name"))
        string[] names = NSArray.StringArrayFromHandle(fieldData.Handle);
        // ...
    }
}

虽然这对我有用,但我觉得有更好或更强大的方法来获取我请求的数据,所以如果那里的任何开发人员可以提供任何其他提示来改进这个解决方案,我很想听听他们的意见。

于 2013-09-20T15:22:39.623 回答
0

如 Facebook SDK 文档Graph API中所述:

当请求返回非 JSON 响应(例如“true”文字)时,该响应将使用此 const 作为键包装到字典中。这仅适用于 v2.1 之前的极少数 Graph API。

因此,您可以先检查结果是否为 NSDictionary,否则您可以像往常一样反序列化 JSON 数据。

下面一些obj-c代码可以翻译成C#/MonoTouch(我不知道框架,希望对你有帮助)。

NSDictionary *dict;
if ([graphResult isKindOfClass:[NSDictionary class]]) {
    dict = (NSDictionary *)graphResult;
} else {
    NSError *JSONError;
    dict = [NSJSONSerialization JSONObjectWithData:graphResult options:NSJSONReadingAllowFragments error:&JSONError];
    if (JSONError) {
        NSLog(@"Facebook: JSON parse error: %@", JSONError);
        // Handle error
    }
}
于 2016-04-29T15:59:11.573 回答