TryGetValue дает неверный результат - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь получить значение из словаря (десериализованный JSON) и проанализировать его как можно дольше.

Когда я быстро просмотрел найденную переменную, в качестве параметра out, как указано, не было "M"ниже enter image description here

Но когда я щелкаю по значению, я обнаружил, что к значению добавляется «M», как указано

enter image description here

Проблема здесь в том, что long.Parse не удается, когда есть "M".Если я удаляю "М" вручную долго. Пара работает нормально.

Почему это странное поведение?и как этого избежать?

Редактировать:

Значение в 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());
        }
    }
}

1 Ответ

0 голосов
/ 28 февраля 2019

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;
}

Вы должны прочитать больше о боксе и распаковке.

У вас есть переменная exp типа object.У вас есть десятичная дробь, и вы хотите поместить ее в 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

Надеюсь, это поможет.

...