Я аутентифицируюсь в 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; }
}
Но это не изменило результат, все еще происходит то же самое.Изображение результата в точке останова: