代码之家  ›  专栏  ›  技术社区  ›  Gopi

TryGetValue给出的结果不正确

  •  0
  • Gopi  · 技术社区  · 6 年前

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

    当我快速查看变量时,我发现没有“M”作为下面给出的输出参数a s的一部分 enter image description here

    enter image description here

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

    编辑:

    {
      "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());
            }
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   jomsk1e    6 年前

    M表示十进制,D表示双精度,如果要解析为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
    

    我希望这能有帮助。

    推荐文章