37659


以下のようなことをやりたいのですが、どうすればいいでしょうか？

[code]

    Hashtable data = new Hashtable();
    data["key1"] = uint.MaxValue;
    data["key2"] = ulong.MaxValue;
    
    //確認(問題なし)
    uint key1 = (uint)data["key1"];    //4294967295
    ulong key2 = (ulong)data["key2"];  //18446744073709551615
    
    //{"key2":18446744073709551615,"key1":4294967295}
    string json = JsonConvert.SerializeObject(data);
    
    //復元
    Hashtable data2 = JsonConvert.DeserializeObject<Hashtable>(json);
    
[/code]

この復元したdata2を元の型にしようとするとエラーが起きます

[code]

    //System.InvalidCastException : Unable to cast object of type 'System.Int64' to type 'System.UInt32'.
    uint key3 = (uint)data2["key1"];
    
    //System.InvalidCastException : Unable to cast object of type 'System.Numerics.BigInteger' to type 'System.UInt64'.
    ulong key4 = (ulong)data2["key2"];
    
[/code]

どなたか解決方法を教えて下さい  
よろしくお願いします


CC BY-SA 3.0
2017-09-01T04:32:46.403
37657
2017-09-01T06:53:08.513
22913
question
c# json
C# Hashtableを使ったJsonConvertの数値型で変換エラー


型を明示せずにデシリアライズしているため、`Hashtable`に含まれる数値が元の型と異なっているようです。基本的な対策としてはメッセージにある通りの型に一度キャストしてから目的の型に変換することですが、

[code]

    uint key3 = (uint)(long)data2["key1"];
    ulong key4 = (ulong)(BigInteger)data2["key2"];
    
[/code]

`IConvertible`を使用するとJson.NETの実装に依存しない記述が可能です。ですが`BigInteger`は`IConvertible`を実装しませんので、別に扱わなくてはなりません。`

[code]

    uint key3 = ((IConvertible)data2["key1"]).ToUInt32(null);
    ulong key4 = data2["key2"] is BigInteger : (ulong)(BigInteger)data2["key2"]
                     :((IConvertible)data2["key2"]).ToUInt64(null);
    
[/code]


CC BY-SA 3.0
2017-09-01T06:53:08.513
37659
2017-09-01T06:53:08.513
5750
37657
answer