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认为它是一个字符串,那么这将是一个非常快速和简单的检查。尝试一下。同样的错误。我觉得值得一试。但是(希望如此)在下面为您发布了一个好的答案。