2015-02-05 3 views
0

Я использую Oauth2 для получения информации о пользователе из Facebook. Результат я получаю в формате JSON, но когда я пытаюсь разобрать его с помощью JSON.NET, я получаю сообщение об ошибке: Исключение: System.ArgumentException: Неполный вход JSON. В строке 1, столбец 0.Не удается разобрать вывод JSON

Пример кода:

request.GetResponseAsync().ContinueWith(t =>{ 
if(!t.IsFaulted && !t.IsCanceled){ 
    try{ 
     Console.WriteLine(t.Result.GetResponseText()); 

     dynamic obj = JsonObject.Parse(t.Result.GetResponseText()); 
     Console.WriteLine(obj.first_name); 

    } catch (Exception e) { 
     Console.WriteLine("Exception : "+ e); 
    } 
    } 
}); 

Метод t.Result.GetResponseText() возвращает строку в следующем формате:

{ 
"id":"some_id", 
"bio":"some_bio", 
"first_name":"some_name", 
"gender":"male", 
"last_name":"some_name", 
"link":"https:\/\/www.facebook.com\/app_scoped_user_id\/some_user_id\/", 
"locale":"nb_NO", 
"middle_name":"some_name", 
"name":"some_name", 
"timezone":1, 
"updated_time":"2014-09-18T12:48:34+0000", 
"verified":true 
} 

кто-то в состоянии указать на то, что я здесь отсутствует? Заранее спасибо!

+0

Вы отлаживали, и это то, что вы получаете? JSON кажется действительным ... –

+0

Это сообщение об ошибке. Я также думаю, что JSON, похоже, действителен. Так что я не понимаю. Исключение: System.ArgumentException: Неполный вход JSON. В строке 1, колонке 0 в System.Runtime.Serialization.Json.JavaScriptReader.ReadCore() [0x00225] в ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.6.0.51/src/mono/mcs/ class/System.ServiceModel.Web/System.Runtime.Serialization.Json/ – user2236165

ответ

2

Сообщение об ошибке указывает, что текст ответа является пустой строкой (неполный ввод JSON, первая строка, первый символ).

Просто догадка: не удается ли решить проблему, если вы сохраняете текст ответа во временной переменной?

var responseText = t.Result.GetResponseText(); 
Console.WriteLine(responseText); 
dynamic obj = JsonObject.Parse(responseText); 

Причина, почему это работает так, что t.Result.GetResponseText() только возвращает значение в первый раз, что вы называете его. Основной поток не поддерживает поиск, и считыватель JSON не кэширует значение внутри.

+0

Нет, это не так, однако, если я копирую строку JSON в строковой переменной, а затем использую ее в десериализованном методе, объект данных не является нулевым , Если я использую t.Result.GetResponseText(), объект данных имеет значение null. если я храню текст ответа во временной переменной, объект данных также является нулевым. – user2236165

+0

Так ясно, что возвращаемое значение 't.Result.GetResponseText()' не совпадает с тем, которое вы вставляете вручную. –

+0

Правда, но опять-таки мне кажется странным, что когда я вывожу 't.Result.GetResponseText()', я получаю точную строку JSON, которую я написал в исходном сообщении. – user2236165

2

Создать класс, который может десериализации заданные данные JSon

public class Rootobject 
     { 
      public string id { get; set; } 
      public string bio { get; set; } 
      public string first_name { get; set; } 
      public string gender { get; set; } 
      public string last_name { get; set; } 
      public string link { get; set; } 
      public string locale { get; set; } 
      public string middle_name { get; set; } 
      public string name { get; set; } 
      public int timezone { get; set; } 
      public DateTime updated_time { get; set; } 
      public bool verified { get; set; } 
     } 

затем десериализации данные JSon использованием Json.NET

var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(t.Result.GetResponseText()); 

работал для меня
Надеюсь, что это помогает

+0

Я больше не получаю сообщение об ошибке JSON, но если я попытаюсь вывести что-либо из объекта данных, такого как Console.WriteLine (data.id), я получаю исключение NullReferenceException. Вы это понимаете? – user2236165

+0

Редактировать: Странно.Если я скопирую строку JSON в строковой переменной и затем использую ее в десериализованном методе, объект данных не является нулевым. Если я использую t.Result.GetResponseText(), объект данных имеет значение null. – user2236165

0

Спасибо Стивену Лийкенсу мы выяснили, что метод t.Result.GetResponseText() возвращает только то, что его первый раз вызывает. Во второй раз он возвращает пустую строку.

Смежные вопросы