Проблема десериализации ответа профиля Google - PullRequest
0 голосов
/ 27 марта 2019

Я аутентифицируюсь в Google в приложении Xamarin.Forms.После аутентификации я хочу получить электронную почту пользователя и использовать этот код, который я адаптировал из этого блога , код для получения электронной почты:

public class GoogleProfile
{
    [Preserve]
    [JsonConstructor]
    public GoogleProfile() { }

    public string sub { get; set; }
    public string name { get; set; }
    public string given_name { get; set; }
    public string profile { get; set; }
    public string picture { get; set; }
    public string email { get; set; }
    public string email_verified { get; set; }
    public string locale { get; set; }
}

public class GoogleService
{
    public async Task<string> GetEmailAsync(string tokenType, string accessToken)
    {
        var httpClient = new HttpClient();
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(tokenType, accessToken);
        var json = await httpClient.GetStringAsync("https://www.googleapis.com/oauth2/v3/userinfo");//https://www.googleapis.com/userinfo/email?alt=json");
        var profile = JsonConvert.DeserializeObject<GoogleProfile>(json);
        return profile.email;
    }
}

Теперь с точкой останова в последнемстрока return profile.email Я "видел" файл json следующим образом:

{
  "sub": "",
  "name": "",
  "given_name": "",
  "profile": "",
  "picture": "",
  "email": "",
  "email_verified": "",
  "locale": "",
}

Между кавычками находятся данные, очевидно.

Я не очень привык к JSonно читая это я думал, что формат просто "nameOfProperty":"ValueOfProperty", поэтому я сделал GoogleProfile объект.

Я также читал, что атрибуты [Preserve] и [JsonConstructor] необходимы, чтобы компоновщик не просто «удалял» пустые конструкторы при компиляции.

Нет никаких исключений и нет явных проблем, но если я поставлю точку останова в последней строке return profile.email;, я увижу, что у объекта json есть все данные и все в порядке, но у объекта profile есть только emailсвойство со значением null ...

Я не понимаю: что случилось с другими свойствами?Это вообще возможно?Вы знаете, вы кодируете объект с кучей свойств, но объект создается только с одним из этих свойств?Если объект имел все свойства со значением null, хорошо, но куда делись другие свойства?

Просто чтобы быть уверенным, что я очистил и перестроил проекты и решение, я удалил bin и obj папок, а затем очистите и восстановите заново ... Я сделал очевидные вещи.

Дело в том, что, как вы можете видеть в блоге, о котором я упоминал ранее, сначала я не использовал GoogleProfile объект, я только что скопировал объект в блоге ... который имеет только одно свойство с именем email.Возможно ли, что визуальная студия или xamarin или что-то прослушалось, и изменения не отразились?Я сомневаюсь в этом, потому что я изменил URI, используемый в методе GetStringAsync, и это отразилось, но я не знаю.

PD: В то же время я анализирую JSON напрямуюкак обычная строка, это простой объект, и мне действительно нужно только электронное письмо, но было бы жаль, что я должен был бы проанализировать его таким образом, а не просто десериализовать его.


Редактировать: Как подсказал Скин в комментариях, которые я использовал http://jsonutils.com/

Одним из свойств был bool (конечно), поэтому я изменил его и теперь объектэто:

public class GoogleProfile
{
    [Preserve]
    [JsonConstructor]
    public GoogleProfile() { }

    public string sub { get; set; }
    public string name { get; set; }
    public string given_name { get; set; }
    public string profile { get; set; }
    public string picture { get; set; }
    public string email { get; set; }
    public bool email_verified { get; set; }
    public string locale { get; set; }
}

Но это не изменило результат, все еще происходит то же самое.Изображение результата в точке останова:

Breakpoint values

1 Ответ

1 голос
/ 28 марта 2019

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

Мои шаги:

  1. скопируйте свой код в мой проект.
  2. получить мой собственный токен, используя проект в блоге
  3. установка newtonsoft пакет Nuget
  4. запустите проект и получите результат

Итак, есть ли проблемы с вашим аккаунтом? У вас был адрес электронной почты? Какая разница с моей?

Вот что я получаю:

json Result

Код:

public partial class MainPage : ContentPage
{
    public MainPage()
    {

        InitializeComponent();

        testAsync();
    }

    public async Task testAsync()
    {

        GoogleService googleS = new GoogleService();
        // use your token here
        var email = await googleS.GetEmailAsync("", "");
        Console.WriteLine(email);
    }

    public class GoogleProfile
    {
        [Preserve]
        [JsonConstructor]
        public GoogleProfile() { }

        public string sub { get; set; }
        public string name { get; set; }
        public string given_name { get; set; }
        public string profile { get; set; }
        public string picture { get; set; }
        public string email { get; set; }
        public string email_verified { get; set; }
        public string locale { get; set; }
    }

    public class GoogleService
    {
        public async Task<string> GetEmailAsync(string tokenType, string accessToken)
        {
            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            var json = await httpClient.GetStringAsync("https://www.googleapis.com/oauth2/v3/userinfo");//https://www.googleapis.com/userinfo/email?alt=json");
            var profile = JsonConvert.DeserializeObject<GoogleProfile>(json);

            Console.WriteLine(json);
            Console.WriteLine(profile);


            return profile.email;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...