2015-12-08 77 views
2

我有这样的代码: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'.。请建议我。

+0

你试过'公共静态隐式操作数(字符串ID) { 返回新号码(uint.Parse(ID)); }'? –

+0

我不太明白这是如何工作的。在json中,'123' *是一个数字。 – blower135

+0

是的,它是一个数字。但如果由于任何原因JsonType认为它是一个字符串,这将是一个非常快速和容易的检查。 –

回答

1

Console app/Any 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}"); 
    } 
} 
1

如果添加从longNumberimplicit(或explicit)的转换,这将正常工作。

JSON.NET在处理积分类型时与long一起使用,而不是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