如何使用带有身份验证令牌的 DataContractJsonSerializer
How to use DataContractJsonSerializer with auth token
我有一个 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
class:
[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
时,issued
和 expires
DateTime
值设置为最小日期时间值(即 1/ 1/0001 12:00:00 上午)。其他值按预期返回,授权尝试成功。
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);
我怀疑是由于变量名不匹配(.expires
与 expires
),JSON 序列化程序无法解析这些字段。具体来说,.expires
中的圆点或句点是错误的。
我想做的是从 JSON 文本中获取 .expires
值,并在我的应用程序中使用它来跟踪令牌何时过期。如果令牌已过期,我想在进行其他 Web 服务调用之前自动请求一个新令牌。
我不能将 AuthToken.expires
命名为 .expires
,因为这是 C# 中的无效语法。
如何从返回的 JSON 对象中提取 .expires
信息?我的偏好是让 DataContractJsonSerializer
自动为我处理这个问题,但我愿意接受其他选择。
使用
[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")
});
我有一个 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
class:
[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
时,issued
和 expires
DateTime
值设置为最小日期时间值(即 1/ 1/0001 12:00:00 上午)。其他值按预期返回,授权尝试成功。
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);
我怀疑是由于变量名不匹配(.expires
与 expires
),JSON 序列化程序无法解析这些字段。具体来说,.expires
中的圆点或句点是错误的。
我想做的是从 JSON 文本中获取 .expires
值,并在我的应用程序中使用它来跟踪令牌何时过期。如果令牌已过期,我想在进行其他 Web 服务调用之前自动请求一个新令牌。
我不能将 AuthToken.expires
命名为 .expires
,因为这是 C# 中的无效语法。
如何从返回的 JSON 对象中提取 .expires
信息?我的偏好是让 DataContractJsonSerializer
自动为我处理这个问题,但我愿意接受其他选择。
使用
[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")
});