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.Serialize nur 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 (S7Client hört sich nach der Siemens-Library an), dann probiere

    var 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?


Anmelden zum Antworten