如何将DataContractJsonSerializer与auth令牌一起使用

本文关键字:令牌 一起 auth DataContractJsonSerializer | 更新日期: 2023-09-27 18:21:28

我有一个JSON文本,如下所示:

{
    "access_token":"really-long-string-here",
    "token_type":"bearer",
    "expires_in":1234567,
    "userName":"GlenH7@Foo.com",
    ".issued":"Mon, 09 Nov 2015 23:02:04 GMT",
    ".expires":"Mon, 23 Nov 2015 23:02:04 GMT"
}

和一个看起来像这样的AuthToken类:

[DataContract]
public class AuthToken
{
    [DataMember]
    public string access_token { get; set; }
    [DataMember]
    public string token_type { get; set; }
    [DataMember]
    public long expires_in { get; set; }
    [DataMember]
    public string userName { get; set; }
    [DataMember]
    public DateTime issued { get; set; }
    [DataMember]
    public DateTime expires { get; set; }
}

但是,当我检查以下代码中的authToken时,issuedexpires DateTime值被设置为最小日期时间值(即1/1/0001 12:00:00 AM)。其他值按预期返回,并且授权尝试成功。

HttpResponseMessage response = await httpClient.PostAsync("/MyAuthPath", authContent);
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(AuthToken));
Stream responseStream = await response.Content.ReadAsStreamAsync();
AuthToken authToken = (AuthToken)jsonSerializer.ReadObject(responseStream);

我怀疑,由于变量名不匹配(.expiresexpires),JSON序列化程序无法解析这些字段。具体地说,.expires中的点或周期是在抛出东西

我想做的是从JSON文本中获取.expires值,并在我的应用程序中使用它来跟踪令牌何时过期。如果令牌已过期,我希望在进行其他web服务调用之前自动请求一个新令牌。

我不能将AuthToken.expires命名为.expires,因为这在C#中是无效语法。

如何从返回的JSON对象中提取.expires信息?我倾向于让DataContractJsonSerializer自动为我处理这件事,但我对其他选择持开放态度。

如何将DataContractJsonSerializer与auth令牌一起使用

使用

    [DataMember(Name = "json_name")]

像这样:

[DataContract]
public class AuthToken 
{
    [DataMember(Name = ".expires")]
    public long expires_in { get; set; }
}

如果你想设置默认值,可以使用这个:

    [OnDeserializing]
    public void OnDeserializing(StreamingContext context)
    {
        expires_in = blabla
    }

由于您使用的是非标准日期格式,因此需要指定一个序列化程序设置对象,以便处理日期时间。如果您使用的是.NET 4.5或更高版本,则可以使用:

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(AuthToken),
    new DataContractJsonSerializerSettings
    {
        DateTimeFormat = new DateTimeFormat("ddd, dd MMM yyyy HH:mm:ss Z")
    });