Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将DataContractJsonSerializer与auth令牌一起使用_C#_Json_Datacontractserializer - Fatal编程技术网

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

C# 如何将DataContractJsonSerializer与auth令牌一起使用,c#,json,datacontractserializer,C#,Json,Datacontractserializer,我有一个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" } [D

我有一个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"
}
[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; }
}
[DataContract]
public class AuthToken 
{
    [DataMember(Name = ".expires")]
    public long expires_in { get; set; }
}
还有一个
AuthToken
类,如下所示:

{
    "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"
}
[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; }
}
[DataContract]
public class AuthToken 
{
    [DataMember(Name = ".expires")]
    public long expires_in { get; set; }
}
但是,当我检查以下代码中的
authToken
时,发出的
过期的
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);

我的怀疑是,由于变量名(
.expires
vs
expires
)不匹配,JSON序列化程序无法解析这些字段。具体地说,
.expires
中的点或句点会使东西脱落

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

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

如何从返回的JSON对象中提取
.expires
信息?我的首选是让
DataContractJsonSerializer
为我自动处理这个问题,但我愿意接受其他选择。

使用

    [DataMember(Name = "json_name")]
像这样:

{
    "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"
}
[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; }
}
[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")
    });

是否也可以为DateTime指定默认解析格式?否。我将datetimes序列化为字符串,然后转换为DateTime。否则,由于无效的日期格式,您将从.net中获得愚蠢的异常。@GlenH7-在.net 4.5及更高版本中,您可以指定
DateTime
格式。请参阅与@dbc相关的内容-感谢您提供的链接,它将所有内容粘合在一起。我已将其编辑成我的答案。