2015-12-08 95 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