我有这个代码:
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}
当我尝试对此进行反序列化时,我会得到一个JsonException Error converting value 123 to type 'Tester2.Program+Number'.
。请通知我。
如果添加从long
到Number
的implicit
(或explicit
)转换,这将正常工作。
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;
}
}
显然,这可能会导致溢出错误,所以要小心。另一个解决方案是创建一个自定义转换器来处理此问题(如果您正在序列化和反序列化此类型,则可能值得研究)。
下面是一个工作示例:https://dotnetfiddle.net/MP4E3N
控制台应用程序/任何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}");
}
}