反序列化 Json 对象会得到一个“空字段”
本文关键字:一个 字段 空字段 对象 Json 反序列化 | 更新日期: 2023-09-27 18:32:34
我一直在努力弄清楚为什么我在反序列化 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 对象,但不知何故将一个字段保留为 null。
这是编码问题吗?在 API 文档中,它说编码必须设置为 System.Text.Encoding.Default。
添加类似
content.Headers.ContentEncoding.Clear();
content.Headers.ContentEncoding.Add("Default"); // "Default" or "utf-8"
不要帮忙。
我的类中的所有字段名称都与 json 对象的键匹配,并且它们的类型相同。
我很确定这是一个简单的问题,但我被困在这一点上。
多谢!
也许是这条线
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);
在我的
OAuthResponse中的每个字段上添加具有相应名称的[JsonProperty(PropertyName = "JsonObjectPropertyName")],并更改我的字段名称就可以了!
在这种情况下:
/// <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;
谢谢!