C# Json.NET隐式转换

C# Json.NET隐式转换,c#,json.net,C#,Json.net,我有以下代码: class Sometype { public Number pos { get; set; } } class Number { private uint num; private Number(uint num) { this.num = num; } public static implicit operator uint(Number sid) { return sid.num;

我有以下代码:

class Sometype
{
    public Number pos { get; set; }
}

class Number
{
    private uint num;

    private Number(uint num)
    {
        this.num = num;
    }

    public static implicit operator uint(Number sid)
    {
        return sid.num;
    }

    public static implicit operator Number(uint id)
    {
        return new Number(id);
    }
}
这个json:
{pos:123}


当我尝试反序列化它时,将值123转换为类型“Tester2.Program+Number”时会出现JsonException
错误。
。请通知我。

控制台应用程序/任何CPU的完整源代码如下。如果这对您不起作用,请将pos的声明更改为object类型,然后执行
pos.GetType()
查看如果不是Int64,您实际得到的是什么

using System;
using Newtonsoft.Json;


class Sometype
{
    public Number pos { get; set; }
}

class Number
{
    private uint num;

    private Number(uint num)
    {
        this.num = num;
    }

    public static implicit operator uint(Number sid)
    {
        return sid.num;
    }

    public static implicit operator Number(Int64 id)
    {
        return new Number((uint)id);
    }

}

class Program
{
    static void Main()
    {
        Sometype thing = JsonConvert.DeserializeObject<Sometype>("{\"pos\":123}");
    }
}
使用系统;
使用Newtonsoft.Json;
类Sometype
{
公共编号pos{get;set;}
}
班号
{
私有单位数;
专用号码(uint num)
{
this.num=num;
}
公共静态隐式运算符uint(编号sid)
{
返回sid.num;
}
公共静态隐式运算符编号(Int64 id)
{
返回新编号((uint)id);
}
}
班级计划
{
静态void Main()
{
Sometype thing=JsonConvert.DeserializeObject(“{\”pos\“:123}”);
}
}

如果添加从
long
Number
隐式
(或
显式
)转换,这将正常工作

当处理整型类型时,JSON.NET使用的是
long
s,而不是
uint
s,因此从
uint
开始的强制转换永远不会被调用。例如:

class Number
{
    private uint num;

    private Number(uint num)
    {
        this.num = num;
    }

    public static implicit operator Number(uint id)
    {
        return new Number(id);
    }

    public static implicit operator Number(long id)
    {
        return new Number((uint)id);
    }

    public static implicit operator uint(Number sid)
    {
        return sid.num;
    }
}
显然,这可能会导致溢出错误,因此请小心。另一个解决方案是创建一个自定义转换器来处理此问题(如果您正在序列化和反序列化此类型,可能值得研究)


这里有一个工作示例

您是否尝试过
公共静态隐式运算符编号(字符串id){返回新编号(uint.Parse(id));}
?我不太明白这是如何工作的。在json中,
123
是一个数字。是的,它是一个数字。但是,如果出于任何原因JsonType认为它是一个字符串,那么这将是一个非常快速和简单的检查。尝试一下。同样的错误。我觉得值得一试。但是(希望如此)在下面为您发布了一个好的答案。