2013-09-18 5 views
0

Я работаю над iOS-приложением, используя среду MonoTouch. Я использую Visual Studio 2010 Professional SP1 с расширением Xamarin.iOS (v1.3.250). Я смог открыть действительный FacebookConnect.FBSession с помощью FacebookConnect.FBLoginView без каких-либо проблем, но когда я пытаюсь сделать запрос API Графа, используя FacebookConnect.FBRequest, я получаю нестандартную строку стиля JSON. Когда я запускаю следующий запрос через Graph API Explorer:Facebook Graph API не возвращается стандарт JSON

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 'как' ответ:

{ 
    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 в целом, и я действительно в недоумении за то, что происходит с строкой ответа, которую я получаю. Любая помощь, отзывы, идеи очень приветствуются. Благодарю.

ответ

1

* Решение *

После связки рыть вокруг него, кажется, что ответ Graph API действительно JSON, но он получает преобразуется в FBGraphObject, который держит NSMutableArray в нем данные делают свой путь через 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); 
     // ... 
    } 
} 

Хотя это работает для меня, я чувствую, что есть лучший или более надежный способ получить данные, которые я просил, поэтому, если какие-либо разработчики могут предложить дополнительные советы для улучшения этого решения, я бы хотел услышать их.

0

Как указано в Facebook SDK документации Graph API:

Когда запрос возвращает ответ без JSON (например, «истинный» буквальное), , что ответ будет вставлено в словарь, используя этот сопзЬ как ключ. Это применимо только для очень небольшого количества графических API до версии 2.1.

Итак, вы можете проверить сначала, если результат 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 
    } 
}