首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TryGetValue给出了错误的结果

TryGetValue给出了错误的结果
EN

Stack Overflow用户
提问于 2019-02-28 11:12:48
回答 1查看 693关注 0票数 1

我试图从Dictionary(JSON反序列化)中获取值,并将其解析为长时间。

当我快速查看变量时,我发现没有"M“作为下面给出的out参数a的一部分。

但是当我点击这个值时,我发现"M“被添加到给定的值中。

这里的问题是,当存在"M“时,long.Parse会失败。如果我手动删除"M“,long.Parse可以正常工作。

为什么会有这种奇怪的行为?以及如何避免这种情况?

编辑:

在payloadJson中的值是

代码语言:javascript
复制
{
  "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()));
}

控制台应用程序

代码语言:javascript
复制
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());
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-28 11:22:47

M的意思是十进制,D的意思是双,如果你想解析成long,这个方法会工作:

代码语言:javascript
复制
long vOut = Convert.ToInt64(exp);

这是TryGetValue的签名:

代码语言:javascript
复制
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;
}

你应该读更多关于拳击和取消拳击的文章。

您有一个对象类型的变量exp。你有一个十进制,你想把它放到exp中。您可以创建一个可以存储十进制的新对象,然后将对该对象的引用分配给exp。那就是拳击。

举个例子:

代码语言:javascript
复制
bool x = false; //stack
object o = b; //box
bool x2 = (bool)o; //unboxing

为什么我们用拳击?主要是检查明渠:

代码语言:javascript
复制
if (x == null) //will not compile because bools cannot be of null
if (o == null) //will compile and always returns false

我希望这能帮到你。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54924379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档