反序列化 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 对象的键匹配,并且它们的类型相同。

我很确定这是一个简单的问题,但我被困在这一点上。

多谢!

反序列化 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'":'"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);
在我的

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;

谢谢!