0

Je sérialisé System.Drawing.Color à l'aide JSON JavaScriptSerializer, mais lorsque je tente de désérialiser, il retourne l'objet couleur avec toutes les valeurs 0.JavaScriptSerializer ne désérialise pas System.Drawing.Color. Comment désérialiser l'objet Couleur?

Sample JSON est comme ci-dessous.

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

Voici la capture d'écran de l'aspect de l'objet désérialisé.

enter image description here

Alors j'ai essayé d'utiliser la bibliothèque JSON.net (de newtonsoft.json). Cela me donne l'erreur ci-dessous.

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. 

Est-il possible de deserialzing JSON à la couleur object.i ont trouvé this question similaire sans answere.

Répondre

1

Comme j'avais JSON très complexe. J'ai atteint la désérialisation en utilisant Color.FromArgb et CustomCreationConverter. Voici comment je l'ai fait en utilisant la bibliothèque Json.net.

J'ai créé une classe qui est responsable de la gestion de la désérialisation pour la classe System.Drawing.Color de la chaîne JSON. vous pouvez trouver sur le site JSON.net.

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; 
    } 
} 

Lorsque désérialisation instance de passage de classe que vous avez créé pour gérer la logique de désérialisation personnalisé

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

Peut-être que vous pouvez utiliser System.Drawing.ColorTranslator.ToHtml pour traduire les instances de couleur à une chaîne hexagonale qui représente une couleur en html et désérialiser avec ColorTranslator.FromHtml comme suggéré à Best solution for XmlSerializer and System.Drawing.Color

+0

j'ai utilisé objet couleur dans des endroits mai, il est impossible d'écrire 'System.Drawing.ColorTranslator.ToHtml 'ou' ColorTranslator.FromHtml'. –

1

Json.NET sérialise System.Drawing.Color très bien.

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] 

Testé contre Json.NET 6.0.3

+0

J'ai essayé cela, pour moi il renvoie le nom de la couleur comme 'Orange' et non les valeurs de ARGB –

Questions connexes