我一直在努力弄清楚为什么在反序列化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;
并且徘徊在&#34; Json&#34;,一切都很好,因为没有字段为空
在下一行反序列化将反序列化的json对象分配给OAuthResponse对象,但不知何故将一个字段保留为null。
这是编码问题吗?在API文档中,它表示必须将编码设置为System.Text.Encoding.Default。
添加
等行content.Headers.ContentEncoding.Clear();
content.Headers.ContentEncoding.Add("Default"); // "Default" or "utf-8"
没有帮助。
所有字段&#39;我的类中的名称与json对象的键匹配,它们的类型相同。
我很确定这是一个简单的问题,但我还是坚持这一点。
非常感谢!
答案 0 :(得分:1)
也许是行
string Json = Response.Content.ReadAsStringAsync().Result;
错了。使用:
string Json = await Response.Content.ReadAsStringAsync();
代替。使用异步功能进行调试可能很奇怪。
<强> [编辑] 强>
我不知道班级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\":\"18312b7c108b6084e1e48afjklem51c357733ba1751d1c746e2698304b083cd6\",\"token_type\":\"bearer\",\"expires_in\":7776000,\"refresh_token\":\"995b04af1d408240egkt85ee560a5571f503cecee294fd241abef3e1b8deda9df5\",\"scope\":\"public\",\"created_at\":1454239878}";
JavaScriptSerializer ser = new JavaScriptSerializer();
OAuthResponse Oauthresponse = ser.Deserialize<OAuthResponse>(Json);
答案 1 :(得分:0)
在我的OAuthResponse中的每个字段上添加[JsonProperty(PropertyName =&#34; JsonObjectPropertyName&#34;)]和相应的名称,更改我的字段名称就行了!
在这种情况下:
/// <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;
谢谢!