Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DanCooper“ ()
JSON mit ""Namespace.Irgendwas": bool" deserialisieren
- C#
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von DanCooper.
-
-
DanCooper schrieb:
deserialisierenFalls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Das ist mir klar
Ich kriege das auch mitIsScanningVideo": false
auf die Reihe, aber ich verstehe nicht wie es mitLibrary.IsScanningVideo": false
geht.
Ich kann ja nicht einfach das hier nutzen:
-
-
DanCooper schrieb:
Das ist mir klar
Gugst Du auch hier.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Rinecamo schrieb:
Dafür gibts Attribute (sofern du JSON.NET verwendest, wozu ich dir natürlich rate).
Folgendes über die Variable (z.B. LibraryIsScanningVideo) schreiben:[JsonProperty(PropertyName = "Library.IsScanningVideo")]
Nein, wir verwendenNewtonsoft.Json
.
Geht das damit auch irgendwie? Oder kannst du mir das richtige Stichwort (Attribute?) nennen. mit dem ich Google fragen könnte? -
Woher kommt denn die JSon-Datei?Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
RodFromGermany schrieb:
DanCooper schrieb:
Das ist mir klar
Gugst Du auch hier.
Mag sein, ich kenne leider die richtigen Fachausdrücke bei JSON nicht. Deshalb habe ich "solch ein JSON" geschrieben.
Deinen Link kenne ich, dort gibt's aber auch nur einen nutzlosen Code zurück:
-
-
-
DanCooper schrieb:
KodiFalls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Rinecamo schrieb:
Dafür gibts Attribute (sofern du JSON.NET verwendest, wozu ich dir natürlich rate).
Folgendes über die Variable (z.B. LibraryIsScanningVideo) schreiben:[JsonProperty(PropertyName = "Library.IsScanningVideo")]
Danke, damit klappt es:
Rinecamo schrieb:
Newtonsoft.Json IST Json.NET.
Danke, wieder was gelernt
RodFromGermany schrieb:
DanCooper schrieb:
Kodi
Es gibt da hunderte Namespaces und Klassen. Mit der Lösung von @Rinecamo funktioniert es aber erstmal. Wir benötigen zur Zeit nurLibrary.IsScanningVideo
.
Ich fände es aber trotzdem interessant zu wissen, wie man die Namespaces und Klassen sauber aufbauen würde. Falls du Lust hast, mir das Anhand vonLibrary.IsScanningVideo
zu erklären, dann fände ich das natürlich toll! Ich denke mal, dass man das mit relativ wenig Code umsetzen könnte. Aber ich von JSON und C# nicht so viel Ahnung, kann aber eigentlich gut von Beispielen ableiten
Hier findest du unseren bisherigen Code: GitHub
Die Klasse wäre dann wohl GetInfoBooleansResponse und der Namespace Library
Den grössten Teil haben wir bereits umgesetzt, eigentlich fehlt nur die kompletteGetInfoBooleansResponse
Klasse.
Die Kodi JSON API ist hier dokumentiert: Link
-
Rinecamo schrieb:
Dafür gibts Attribute (sofern du JSON.NET verwendest, wozu ich dir natürlich rate).
Folgendes über die Variable (z.B. LibraryIsScanningVideo) schreiben:[JsonProperty(PropertyName = "Library.IsScanningVideo")]
Hallo Rinecamo
ich wende mich nochmals an dich, da du mir Sicherheit auch hierbei weiterhelfen kannst.
Hab nochmals ein ziemlich ähnliches Problem mitEnum
. Ich muss diesmalis
,true
undfalse
verwenden, was ebenfalls in einen String umgewandelt werden muss. Leider geht die Lösung mitEnumMember(Value)
nicht:
Kannst du mir auch hier auf die Sprünge helfen?
-
-
Rinecamo schrieb:
Hast du nen passenden JSON-Ausschnitt aus dem du das Enum deserialisieren willst?
Versuchen kannst du es mal mit:[JsonConverter(typeof(StringEnumConverter))]
über dempublic enum Operators
Wenn ich das direkt darüber schreibe kommt der FehlerUnerwartetes Zeichen "".
:
C#-Quellcode
- namespace XBMCRPC.List.Filter
- {
- [JsonConverter(typeof(StringEnumConverter))]
- public enum Operators
- {
- contains,
- doesnotcontain,
- [EnumMember(Value = "is")]
- Is,
- isnot,
- startswith,
- endswith,
- greaterthan,
- lessthan,
- after,
- before,
- inthelast,
- notinthelast,
- [EnumMember(Value="true")]
- True,
- [EnumMember(Value="false")]
- False,
- between,
- }
- }
Genutzt werden die Enums hier:
is
,true
undfalse
(klein geschrieben) kann ich ja in C# nicht direkt als Enum nutzen, weil das normale Operatoren(?) sind. Ich muss die also mit grossem Anfangsbuchstaben auflisten. Diese müssen aber danach für den JSON Request in Kleinbuchstaben umgewandelt werden. Aber ich glaube das hast du eh schon verstanden
EDIT:
Sorry, der FehlerUnerwartetes Zeichen "".
kommt doch nicht. Funktionieren tut es aber trotzdem nicht.
Hier hat einer das selbe Problem mit selbem Lösungsvorschlag, bei mir funktioniert das aber nicht.Is
wird bei mir auch im Request immer noch mit grossem Anfangsbuchstaben eingesetzt.
Edit 2:
Moch jemand mit sogar exakt den gleichen Operatoren wie ich nutzen muss: Link
Selbe Lösung, bei ihm scheints aber irgendwie zu gehen. Ich habe ebenfalls versucht den Converter direkt über die aufrufende Klasse zu setzen, geht bei mir aber auch nicht:
EDIT 3:
Ich hab mitlerweile rausgefunden, dass der Converter bereits gloabal gesetzt ist:
Entferne ich diesen, erhalte ich anstelle der Strings die Enum-Nummer. DerStringEnumConverter
scheint also schonmal soweit zu funktionieren und es ist nicht nötig, dass ich diesen über die Klasse setze.
Meiner Meinung nach funktioniert einfach der[EnumMember(Value="value")]
Teil nicht...
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „DanCooper“ ()
-
Ich weiß nicht, wo genau der Fehler liegt, aber ich würde es einfach mal so machen.
So ist das Enum auch noch benutzbar und man muss sich nicht mit lowercase items rumschlagen.
C#-Quellcode
-
- [JsonConverter(typeof(OperatorEnumConverter))]
- public enum Operators
- {
- Contains,
- DoesNotContain,
- Is,
- IsNot,
- StartsWith,
- EndsWith,
- GreaterThan,
- LessThan,
- After,
- Before,
- InTheLast,
- NotInTheLast,
- True,
- False,
- Between
- }
- public class OperatorEnumConverter : JsonConverter
- {
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
- {
- Operators weaponType = (Operators)value;
- writer.WriteValue(weaponType.ToString().ToLower());
- }
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- var values = Enum.GetNames(typeof(Operators));
- var enumValue = values.FirstOrDefault(v => v.ToLower().Equals(reader.Value.ToString()));
- Operators op;
- if (Enum.TryParse(enumValue, out op)) {
- return op;
- }
- return null;
- }
- public override bool CanConvert(Type objectType)
- {
- return objectType == typeof(string);
- }
- }
-
-
Rinecamo schrieb:
Ich weiß nicht, wo genau der Fehler liegt, aber ich würde es einfach mal so machen.
So ist das Enum auch noch benutzbar und man muss sich nicht mit lowercase items rumschlagen.
C#-Quellcode
-
- [JsonConverter(typeof(OperatorEnumConverter))]
- public enum Operators
- {
- Contains,
- DoesNotContain,
- Is,
- IsNot,
- StartsWith,
- EndsWith,
- GreaterThan,
- LessThan,
- After,
- Before,
- InTheLast,
- NotInTheLast,
- True,
- False,
- Between
- }
- public class OperatorEnumConverter : JsonConverter
- {
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
- {
- Operators weaponType = (Operators)value;
- writer.WriteValue(weaponType.ToString().ToLower());
- }
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- var values = Enum.GetNames(typeof(Operators));
- var enumValue = values.FirstOrDefault(v => v.ToLower().Equals(reader.Value.ToString()));
- Operators op;
- if (Enum.TryParse(enumValue, out op)) {
- return op;
- }
- return null;
- }
- public override bool CanConvert(Type objectType)
- {
- return objectType == typeof(string);
- }
- }
Danke, das hat so ebenfalls wunderbar funktioniert!
-
Ähnliche Themen
-
3 Benutzer haben hier geschrieben
- DanCooper (10)
- RodFromGermany (4)
- Rinecamo (4)