TryGetValue 给出不正确的结果
TryGetValue gives incorrect result
我正在尝试从字典中获取值(JSON 反序列化)并将其解析为 long。
当我快速查看变量时,我发现没有 "M" 作为下面给出的 out 参数的一部分
但是当我点击该值时,我发现 "M" 被添加到给定的值中
这里的问题是 long.Parse 在有 "M" 时失败。如果我手动删除 "M" long.Parse 工作正常。
为什么会出现这种奇怪的行为?以及如何避免这种情况?
编辑:
payloadJson 中的值为
{
"http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata": "admin@admin.com",
"expiry": 1551354842.0,
"issuedAt": 1551351242.0,
"notBefore": 1566989642.0,
"isRefresh": false
}
var payloadData = jsonSerializer.Deserialize<Dictionary<string, object>>(payloadJson);
object exp;
if (payloadData != null && (checkExpiration && payloadData.TryGetValue("expiry", out exp)))
{
var validTo = FromUnixTime(long.Parse(exp.ToString()));
}
控制台应用程序
using JWT;
using JWT.Serializers;
using System.Collections.Generic;
using System.Web.Script.Serialization;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3VzZXJkYXRhIjoiYWRtaW5AYWRtaW4uY29tIiwiZXhwaXJ5IjoxNTUxMzU0ODQyLjAsImlzc3VlZEF0IjoxNTUxMzUxMjQyLjAsIm5vdEJlZm9yZSI6MTU2Njk4OTY0Mi4wLCJpc1JlZnJlc2giOmZhbHNlfQ.E-fR8VAFAy-mosEfQC3ZPlN2kZBQg02FLYuChdhqHNhzgVsbIjMXUFLHYowf0aUwQRcyoFR2mpiD_5I6drGdnQ";
var jsonSerializer = new JavaScriptSerializer();
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
var payloadJson = decoder.Decode(token, "GAFaS9W4Ys2AA2VHadPdje9gaeWjY8", true);
var payloadData = jsonSerializer.Deserialize<Dictionary<string, object>>(payloadJson);
object exp;
payloadData.TryGetValue("expiry", out exp);
var tempExpiry = long.Parse(exp.ToString());
}
}
}
M表示decimal,D表示double,如果要解析为long,这样可以:
long vOut = Convert.ToInt64(exp);
这是TryGetValue的签名:
public bool TryGetValue(TKey key, out TValue value) {
int i = FindEntry(key);
if (i >= 0) {
value = entries[i].value;
return true;
}
value = default(TValue);
return false;
}
您应该阅读更多关于装箱和拆箱的内容。
你有一个object类型的变量exp。你有一个小数,你想把它放入 exp。您可以创建一个可以存储小数的新对象,然后将对该对象的引用分配给 exp。那就是拳击。
举个例子:
bool x = false; //stack
object o = b; //box
bool x2 = (bool)o; //unboxing
我们为什么要使用拳击?主要是检查空值:
if (x == null) //will not compile because bools cannot be of null
if (o == null) //will compile and always returns false
希望对您有所帮助。
我正在尝试从字典中获取值(JSON 反序列化)并将其解析为 long。
当我快速查看变量时,我发现没有 "M" 作为下面给出的 out 参数的一部分
但是当我点击该值时,我发现 "M" 被添加到给定的值中
这里的问题是 long.Parse 在有 "M" 时失败。如果我手动删除 "M" long.Parse 工作正常。
为什么会出现这种奇怪的行为?以及如何避免这种情况?
编辑:
payloadJson 中的值为
{
"http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata": "admin@admin.com",
"expiry": 1551354842.0,
"issuedAt": 1551351242.0,
"notBefore": 1566989642.0,
"isRefresh": false
}
var payloadData = jsonSerializer.Deserialize<Dictionary<string, object>>(payloadJson);
object exp;
if (payloadData != null && (checkExpiration && payloadData.TryGetValue("expiry", out exp)))
{
var validTo = FromUnixTime(long.Parse(exp.ToString()));
}
控制台应用程序
using JWT;
using JWT.Serializers;
using System.Collections.Generic;
using System.Web.Script.Serialization;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3VzZXJkYXRhIjoiYWRtaW5AYWRtaW4uY29tIiwiZXhwaXJ5IjoxNTUxMzU0ODQyLjAsImlzc3VlZEF0IjoxNTUxMzUxMjQyLjAsIm5vdEJlZm9yZSI6MTU2Njk4OTY0Mi4wLCJpc1JlZnJlc2giOmZhbHNlfQ.E-fR8VAFAy-mosEfQC3ZPlN2kZBQg02FLYuChdhqHNhzgVsbIjMXUFLHYowf0aUwQRcyoFR2mpiD_5I6drGdnQ";
var jsonSerializer = new JavaScriptSerializer();
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
var payloadJson = decoder.Decode(token, "GAFaS9W4Ys2AA2VHadPdje9gaeWjY8", true);
var payloadData = jsonSerializer.Deserialize<Dictionary<string, object>>(payloadJson);
object exp;
payloadData.TryGetValue("expiry", out exp);
var tempExpiry = long.Parse(exp.ToString());
}
}
}
M表示decimal,D表示double,如果要解析为long,这样可以:
long vOut = Convert.ToInt64(exp);
这是TryGetValue的签名:
public bool TryGetValue(TKey key, out TValue value) {
int i = FindEntry(key);
if (i >= 0) {
value = entries[i].value;
return true;
}
value = default(TValue);
return false;
}
您应该阅读更多关于装箱和拆箱的内容。
你有一个object类型的变量exp。你有一个小数,你想把它放入 exp。您可以创建一个可以存储小数的新对象,然后将对该对象的引用分配给 exp。那就是拳击。
举个例子:
bool x = false; //stack
object o = b; //box
bool x2 = (bool)o; //unboxing
我们为什么要使用拳击?主要是检查空值:
if (x == null) //will not compile because bools cannot be of null
if (o == null) //will compile and always returns false
希望对您有所帮助。