Datenbereich (Pointer) => json
-
Hallo,
ich nutze eine Funktion " plcdevice.GetCpInfo() an die eine Referenz übergeben wird,
in die die Funtion dann Daten in einem "struct" schreibt.Die Struktur sieht so aus ...
public struct S7CpInfo { public int MaxPduLength; public int MaxConnections; public int MaxMpiRate; public int MaxBusRate; };Jetzt möchte ich die Daten lesen und in ein json wandeln.
Beim Test "Console.WriteLine(jsonString);" kommt nur "{}"S7Client.S7CpInfo CpInfo = new S7Client.S7CpInfo(); result = plcdevice.GetCpInfo(ref CpInfo); string jsonString = JsonSerializer.Serialize(CpInfo); Console.WriteLine(jsonString);Wenn ich im Debugger einen Breakpoint mache und die var "Cpinfo" ansehe, sehe ich die Daten.
Es funktioniert auch nachfolgendes ...Console.WriteLine(CpInfo.MaxBusRate);Eigentlich sollte es funktionieren ... sehe aber den Fehler nicht, warum ich das struct nicht nach json wandeln kann ?
Vielen Dank !!!
-
Hatte mal was Ähnliches, da hat sich die Serialisierung per Reflection nur Properties angeguckt, keine normalen Member.
-
Hallo,
das kann es doch nicht sein ...

Hat keiner eine Idee ... ??
-
@DocShoe hat dir doch schon das Problem dargestellt, also daß standardmäßig
JsonSerializer.Serializenur Eigenschaften (properties) serialisiert und nicht normale Member (fields).Also die Internet-Suche ergibt dann z.B. JSON-Serialisierung: Einschließen von Feldern.
Wenn du die Struktur nicht ändern kannst (S7Clienthört sich nach der Siemens-Library an), dann probierevar options = new JsonSerializerOptions { IncludeFields = true }; string jsonString = JsonSerializer.Serialize(CpInfo, options);
-
Hallo,
vielen Dank, das war es.
@DocShoe : Sorry ... das mit der "Reflection nur Properties" hatte ich anders verstanden.
Leider habe ich dadurch ein 2.Problem gesehen.
Mein json String sieht nachfolgend aus{ "ModuleTypeName" : "CPU 314C-2 PN/DP\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "SerialNumber" : "S Q-E3U024642014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "ASName" : "192.168.10.11_MPI-11\u0000\u0000\u0000\u0000", "Copyright" : "Original Siemens Equipment", "ModuleName" : "CPU 314C-2 PN/DP\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" }Dachte ich mir, kein Problem ...
var options = new JsonSerializerOptions { IncludeFields = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, WriteIndented = true // Optional: für bessere Lesbarkeit };Interresiert Ihm aber nicht, der json String wird nicht verändert. Wie kann ich den unicode entfernen, ideal wäre direkt beim serialsieren. Ein nachträgliches
jsonString.Replace ("\0", string.Empty);bringt auch nichts.
Vielen Dank !!!
-
Für \u0000 gibt's halt kein anderes darstellbares Zeichen. Die struct schein char-Arrays zu haben mit einer fixen Länge. Wenn du die als "null-terminated strings" behandeln willst, musst du es ihm extra beibringen.
Ein replace("\u0000", "") sollte übrigens schon funktionieren. Nur deine Variante nicht. Es sind ja keine echten NULL-Zeichen im String sondern ein backslash, ein u und vier Nullen.
MfG SideWinder
-
@worst_case Genügt denn nicht eine der hier gelisteten Libs: https://en.cppreference.com/w/cpp/links/libs.html#Configuration:JSON, die eine Struct in ein JSON-Object (oder String...) umwandeln können, und dabei auch korrekt mit \0 chars umgehen können - sprich, diese Zeichen nicht mitserialisieren?
Oder bin ich gerade auf dem falschen Dampfer unterwegs?