反序列化Json对象得到一个" null字段"

时间:2016-01-31 10:38:12

标签: c# json serialization deserialization

我一直在努力弄清楚为什么在反序列化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对象的键匹配,它们的类型相同。

我很确定这是一个简单的问题,但我还是坚持这一点。

非常感谢!

2 个答案:

答案 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\":\"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);

答案 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;

谢谢!