2014-07-01 91 views
0

我在使用JSON序列化JavaScriptSerializer的System.Drawing.Color,但是當我嘗試反序列化,它返回的所有值0JavaScriptSerializer不是反序列化System.Drawing.Color。如何反序列化Color對象?

樣品JSON是如下Color對象。

{ 
    "A":255, 
    "B":0, 
    "G":165, 
    "IsEmpty":false, 
    "IsKnownColor":true, 
    "IsNamedColor":true, 
    "IsSystemColor":false, 
    "Name":"Orange", 
    "R":255 
} 

下面是反序列化對象的外觀樣式的截圖。

enter image description here

然後我試圖使用JSON.net(newtonsoft.json)庫。它給了我下面的錯誤。

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Drawing.Color' because the type requires a JSON string value to deserialize correctly. 

有deserialzing JSON的任何方式上色object.i發現this類似的問題,沒有任何的answere。

回答

1

因爲我有非常複雜的JSON。我使用Color.FromArgbCustomCreationConverter實現了反序列化。這是我如何使用Json.net庫。

我創建了一個類,負責處理來自JSON字符串的System.Drawing.Color類的反序列化。你可以在JSON.net網站找到simple example

public class ColorConverter : CustomCreationConverter<Color> 
{ 
    public override bool CanWrite { get { return false; } } 
    public override bool CanRead { get { return true; } } 
    public ColorConverter(){ } 
    public override Color Create(Type objectType) 
    { 
     return new Color(); 
    } 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JObject jObject = JObject.Load(reader); 
     Color target = Create(objectType); 
     target = Color.FromArgb(jObject["A"].Value<Int32>(), jObject["R"].Value<Int32>(), jObject["G"].Value<Int32>(), jObject["B"].Value<Int32>()); 
     return target; 
    } 
} 

反序列化時,你已經創建了處理自定義序列化邏輯

MyModelName obj = JsonConvert.DeserializeObject<MyModelName>(json, new ColorConverter()); 
0

也許你可以使用System.Drawing.ColorTranslator.ToHtml顏色實例轉換成表示在HTML顏色的十六進制字符串,並將ColorTranslator.FromHtml反序列化作爲Best solution for XmlSerializer and System.Drawing.Color

+0

我已經在5月的地方它不是寫'System.Drawing.ColorTranslator.ToHtml可行使用Color對象類的實例通'或'ColorTranslator.FromHtml'。 –

1

Json.NET建議連載System.Drawing.Color就好了。

Color c = Color.FromArgb(169, 170, 171, 172); 
Console.WriteLine(c); //Color [A=169, R=170, G=171, B=172] 
string colorStr = JsonConvert.SerializeObject(c); 
Console.WriteLine(colorStr); //"169, 170, 171, 172" 
Color c1 = JsonConvert.DeserializeObject<Color>(colorStr); 
Console.WriteLine(c1); //Color [A=169, R=170, G=171, B=172] 

測試對Json.NET 6.0.3

+0

我試過了,對我而言,它返回的顏色名稱如「Orange」,而不是ARGB的值 –