Forum: PC-Programmierung C# Color aus JSON Datei lesen


von Frank O. (fop)


Lesenswert?

Ich bastele mir gerade eine WinForms Anwendung fürs .NET Framework 4.8 
in C#

Um schnell mal Einstellungen wegspeichern und bei erneutem Programmstart 
wieder hervorholen zu können, habe ich es mit dem JSON Format probiert.

Also
1
using System.Text.Json;
2
using System.Text.Json.Serialization;

hingeschrieben und die verlangten Verweise eingefügt.

Eine Klasse zusammen gestellt, die genau das enthält, was gespeichert 
werden soll.

Im Großen und Ganzen funktioniert auch schon sehr viel. ABER, wenn ein 
Color Struct geladen werden soll, sehe ich nix. Da gibt es den 
Durchblick auf ungewünschte Weise. Sprich, egal welche Farbe gespeichert 
werden sollte, kommt völlig transparent zurück. In der Datei steht 
allerdings noch alles über die gewünschten Farben. Es muss also beim 
Lesen schief gehen.
Das Problem müssen doch noch andere haben. Man findet im Netz auch was, 
allerdings keine Copy&Paste&glücklich sein-Fertiglösung.
Der Versuch eine JsonConverter<Color> Klasse zu erstellen und per 
JsonSerializerOptions in Stellung zu bringen scheitert bei mir. Beim 
Aufruf der read-Methode wirft er eine Exception. TrySkip funktioniert, 
aber ich will ja schon gerne wissen, was drin steht.

Wie komme ich wieder an die richtigen Farben ran ?
Da ich schon eine größere Datei mit Farben gespeichert habe, würde ich 
gerne das Abspeichern so lassen und das Einlesen so ändern, dass es 
diese Infos lesen kann.

PS: mein Array von 3 Farben sieht in der Datei so aus :
1
"farben":[{"R":128,"G":0,"B":0,"A":255,"IsKnownColor":true,"IsEmpty":false,"IsNamedColor":true,"IsSystemColor":false,"Name":"Maroon"},{"R":0,"G":255,"B":0,"A":255,"IsKnownColor":true,"IsEmpty":false,"IsNamedColor":true,"IsSystemColor":false,"Name":"Lime"},{"R":0,"G":0,"B":139,"A":255,"IsKnownColor":true,"IsEmpty":false,"IsNamedColor":true,"IsSystemColor":false,"Name":"DarkBlue"}]

von N. M. (mani)


Lesenswert?

Frank O. schrieb:
> PS: mein Array von 3 Farben sieht in der Datei so aus

Das "farben": steht da aber nicht drin, oder? Das wäre dann nämlich kein 
ordentliches JSON.

Entweder du machst um alles noch ein struct drum {} oder du löschst das 
"farben": komplett weg um nur ein Array von Farben (ohne Bezeichner) zu 
haben.

Frank O. schrieb:
> .NET Framework 4.8 in C#

Nutzt du Visual Studio?
Da kannst du dir die Klasse für die Deserialisierung auch über "Paste 
Special" --> "Paste JSON as Classes" oder so ähnlich generieren lassen.

: Bearbeitet durch User
von Frank O. (fop)


Lesenswert?

N. M. schrieb:
> Das "farben": steht da aber nicht drin, oder? Das wäre dann nämlich kein
> ordentliches JSON.
Das steht unter anderem so in der Datei drinne. Ich habe aber nur einen 
Ausschnitt der Datei hier rein gestellt. Die geschweiften Klammern sind 
in dem Teil, den ich weg gelassen habe. Da wird nämlich ein ganzes 
Objekt serialisiert. Die anderen Eigenschaften sind soweit unauffällig.

von Frank O. (fop)


Lesenswert?

Nach etwas experimentieren, bin ich zu der Vermutung gekommen, dass es 
wohl an der Reihenfolge liegt, in der der Deserialisierer die 
Eigenschaften von Color setzt. Sprich er füllt zuerst A, R, G und B. 
Wenn er aber danach IsNamedColor setzt, bevor Name gesetzt ist, 
zerdeppert er sich wieder alles.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Also, wenn ich vor "farben": eine geschweifte Klammer auf { und am 
Schluß eine
} mache, und als Json-Datei im Windowseditor als UTF8 - Datei speichere, 
habe
ich ein konforme JSON-Datei und kann sie so auch als ganzen Text wieder 
mit meinen JSON-Funktionen auslesen. Die Objekte werden auch genauso 
wiedergegeben.
1
{"farben":[{"R":128,"G":0,"B":0,"A":255,"IsKnownColor":true,"IsEmpty":false,"IsNamedColor":true,"IsSystemColor":false,"Name":"Maroon"},{"R":0,"G":255,"B":0,"A":255,"IsKnownColor":true,"IsEmpty":false,"IsNamedColor":true,"IsSystemColor":false,"Name":"Lime"},{"R":0,"G":0,"B":139,"A":255,"IsKnownColor":true,"IsEmpty":false,"IsNamedColor":true,"IsSystemColor":false,"Name":"DarkBlue"}]}

Also von daher sehe ich da keine Probleme.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Heinz B. schrieb:
> Also von daher sehe ich da keine Probleme.

Dann hast Du ja auch keins. Jedenfalls nicht mit dem Json. Wenn Dein 
Programm dann beim Lesen der Json-Daten irgendwas kaputt macht, dann 
liegt das am Fehler in Zeile 42.

von Frank O. (fop)


Lesenswert?

Bei mir waren nach dem Laden im Color Objekt A, R, G und B ausgenullt.
Ich habe mir dann folgende Krücke ausgedacht, die für mich funktioniert 
:
1
    class PseudoColor
2
    {
3
        [JsonInclude]
4
        public byte R;
5
        [JsonInclude]
6
        public byte G;
7
        [JsonInclude]
8
        public byte B;
9
        [JsonInclude]
10
        public byte A;
11
        [JsonInclude]
12
        public bool IsKnownColor;
13
        [JsonInclude]
14
        public bool IsEmpty;
15
        [JsonInclude]
16
        public bool IsNamedColor;
17
        [JsonInclude]
18
        public bool IsSystemColor;
19
        [JsonInclude]
20
        public string Name;
21
        [JsonIgnore]
22
        public Color echt
23
        {  get
24
            {
25
                return Color.FromArgb(A, R, G, B);
26
            }
27
           set
28
            {
29
                if (value.IsNamedColor)
30
                {
31
                    Name = value.Name;
32
                    IsNamedColor = true;
33
                }
34
                else
35
                {
36
                    Name = string.Format("{0:X2}{1:X2}{2:X2}{3:x2}", value.R, value.G, value.B, value.A);
37
                    IsNamedColor = false;
38
                }
39
                IsSystemColor = value.IsSystemColor;
40
                IsEmpty = value.IsEmpty;
41
                IsKnownColor = value.IsKnownColor;
42
                R = value.R;
43
                G = value.R;
44
                B = value.R;
45
                A = value.R;
46
            }
47
        }

in die ich Deserialisieren lasse.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Frank O. schrieb:

> Der Versuch eine JsonConverter<Color> Klasse zu erstellen und per
> JsonSerializerOptions in Stellung zu bringen scheitert bei mir. Beim
> Aufruf der read-Methode wirft er eine Exception.

Code des Deserializers?
Inhalt der Exception?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.