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;
    }
    public static implicit operator Number(uint id)
    {
        return new Number(id);
    }
}

这个json:{"pos":123}

当我尝试对此进行反序列化时,我会得到一个JsonException Error converting value 123 to type 'Tester2.Program+Number'.。请通知我。

如果添加从longNumberimplicit(或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}");
    }
}

相关内容

  • 没有找到相关文章

最新更新