2016-01-31 2 views
1

Я изо всех сил, чтобы выяснить, почему я получаю пустое поле при десериализации объекта JSonобъект десериализации Json получает «нулевое поле»

public OAuthResponse Get(OAuthRequest TEntity) 
    { 
    OAuthResponse Oauthresponse = new OAuthResponse(); 
     using (System.Net.Http.HttpClient c = GetHttpClient()) 
     { 
      string SerializedEntity = JsonConvert.SerializeObject(TEntity); 
      HttpContent content = new StringContent(SerializedEntity); 
      content.Headers.ContentType = new MediaTypeWithQualityHeaderValue(MessageType); 

      HttpResponseMessage Response = c.PostAsync(_Path, content).Result; 

      string Json = Response.Content.ReadAsStringAsync().Result; 

      Oauthresponse = JsonConvert.DeserializeObject<OAuthResponse>(Json); 
     } 
} 

При получении линии:

string Json = Response.Content.ReadAsStringAsync().Result; 

и парит в «Json», кажется, все в порядке, так как никакие поля не равны нулю

десериализации на следующей строке присваивает десериализованное объект JSON к объекту OAuthResponse, но каким-то образом оставляя одну п ield как null.

Проблема с кодировкой? в документации API говорится, что для кодировки должно быть установлено значение System.Text.Encoding.Default.

добавление строк вроде

content.Headers.ContentEncoding.Clear(); 
content.Headers.ContentEncoding.Add("Default"); // "Default" or "utf-8" 

не помогают.

Все имена полей в моем классе соответствуют ключам объекта json, и их тип идентичен.

Я уверен, что это простой вопрос, но я застрял в этом вопросе.

Большое спасибо!

ответ

1

Может быть линия

string Json = Response.Content.ReadAsStringAsync().Result; 

неправильно. Использование:

string Json = await Response.Content.ReadAsStringAsync(); 

вместо этого. Отладка может быть странной, используя async fuctions.

[Редактировать]

Я не знаю, класс OAuthResponse поэтому я предположил, что это будет что-то вроде этого:

public class OAuthResponse 
{ 
    public string access_token; 
    public string token_type; 
    public int expires_in; 
    public int created_at; 
    public string refresh_token; 
    public string scope; 
} 

Затем эти три линии работают:

string Json = "{\"access_token\":\"18312b7c108b6084e1e48afjklem51c357733ba1751d1c746e2698304b0‌​83cd6\",\"token_type\":\"bearer\",\"expires_in\":7776000,\"refresh_token\":\"995b‌​04af1d408240egkt85ee560a5571f503cecee294fd241abef3e1b8deda9df5\",\"scope\":\"publ‌​ic\",\"created_at\":1454239878}"; 
    JavaScriptSerializer ser = new JavaScriptSerializer(); 
    OAuthResponse Oauthresponse = ser.Deserialize<OAuthResponse>(Json); 
+0

эй спасибо за ваш ответ. Если я это сделаю, мне придется изменить свой метод на открытый асинхронный процесс, и в этом случае Visual Studio скажет мне, что тип возврата должен быть «void» или «Task» –

+0

Это правильно. Или вы используете несинхронную версию функции. Если он существует. – Matthias

+0

Ваш тип возврата - это 'Задача ' – Matthias

0

Добавление [JsonProperty (PropertyName = "JsonObjectPropertyName")] с соответствующим именем над каждым полем в моем OAuthResponse и меняя названия моих полей, просто сделал трюк!

в этом случае:

/// <summary>The OAuth access token</summary> 
    [JsonProperty(PropertyName = "access_token")] 
    public string AccessToken; 

    /// <summary>The type of the OAuth token</summary> 
    [JsonProperty(PropertyName = "token_type")] 
    public string TokenType; 

    /// <summary>The date when the OAuth token will expire</summary> 
    [JsonProperty(PropertyName = "expires_in")] 
    public int ExpiresIn; 

    /// <summary>The OAuth refresh token</summary> 
    [JsonProperty(PropertyName = "refresh_token")] 
    public string RefreshToken; 

    /// <summary>The scope of the OAuth token</summary> 
    [JsonProperty(PropertyName = "scope")] 
    public string Scope; 

Спасибо!

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