Laden...
L
LittleTester
myCSharp.de - Member
40
Themen
158
Beiträge
Letzte Aktivität
vor 2 Jahren
Dabei seit
23.09.2019
Erstellt vor 2 Jahren

Also erstmal Danke an ALLE.

Danke für den Hinweis auf die neue Implementierung von Json. Leider ist es auch so, dass man bei einer Google-Suche, auch über Google News nichts dazu findet, dass Newtonsoft Json praktisch Out of Date ist. Ich werde also natürlich die neue Variante nutzen.

Danke auch an thomas.at mit dem Klartext-Hinweis auf "{get; set;}". Da habe ich echt noch Probleme. NewtonSoft war da wohl etwas toleranter was sowas anging.

Erstellt vor 2 Jahren

Was ist an System.Text.Json besser? Irgendwie wird immer auf das Json von Newtonsoft verwiesen. Da finden sich im Zweifel dann für mich als Anfänger sicher auch mehr Hilfe, weil es wohl jeder kennt und verwendet. Hat ja auch knapp 2,89B downloads bei Nu-Get, was wohl im deutschen 2,89 Millliarden? sind.

Ich habe das trotzdem mal probiert und wohl auch die Lösung gefunden, die mit Newtonsoft funktioniert.
Ich habe die Klasse "InventoryResponse" etwas umgeschrieben und die Klasse "Test" gelöscht. (Ist das richtig?)


class InventoryResponse
{
    public int id;
}

Damit klappt das nun. (Diese "Test"-Klasse kam mir eh komisch vor, habe mich aber natürlich an das Lernbeispiel aus einem Videokurs orientiert.)

Ich habe dann


InventoryResponse inventoryAPI =  JsonConvert.DeserializeObject<InventoryResponse>(response);

auskommentiert und von learn.microsoft.com das Beispiel für "System.Text.Json" versucht umzusetzen. Klappt soweit auch, aber die id ist jetzt "0" (als Zahl, nicht "null")


InventoryResponse? inventoryAPI =  JsonSerializer.Deserialize<InventoryResponse>(response);

Was mache ich falsch?

Erstellt vor 2 Jahren

Ich habe folgendes JSON auf meiner Webseite. Der Quelltext gibt das ebenfalls exakt so wieder.:


{"id":15,"hardwareComputerSerial":"1A2B3C4"}

Wenn ich nun folgenden Code schreibe, dann bekomme ich auch ein anständiges JSON zurück:


string requestUrl = "https://api.meineseite.tld/api.php";

HttpClient httpClient = new HttpClient();

var hardwareComputerSerial = "1A2B3C4";
var urlParameter = requestUrl + "?hardwareComputerSerial=" + hardwareComputerSerial;

HttpResponseMessage responseMessage = httpClient.GetAsync(urlParameter).Result;
string response = responseMessage.Content.ReadAsStringAsync().Result;

In "respnse" steht dann folgendes:

{"id":15,"hardwareComputerSerial":"1A2B3C4"}

Sieht also gut aus.

Nun will ich das ganze deserialisieren.

Dazu habe ich zwei neue Klassen erstellt:


class Test
{
    public int id;
}

class InventoryResponse
{
    public Test id;
}

und dann den Code um eine Zeile erweitert:


InventoryResponse inventoryAPI = JsonConvert.DeserializeObject<InventoryResponse>(response);

Wenn ich das nun ausführe bekomme ich folgenden Fehler zurück:

Newtonsoft.Json.JsonSerializationException: 'Error converting value 15 to type 'SysteminventoryV2.Api+Test'. Path 'id', line 1, position 8.'

Inner Exception
ArgumentException: Could not cast or convert from System.Int64 to SysteminventoryV2.Api+Test.

This exception was originally thrown at this call stack:
[External Code]

In "response" eine Zeile drüber also, bei


string response = responseMessage.Content.ReadAsStringAsync().Result;

steht plötzlich der Wert "null", also "response | null"

Ich habe das Ganze auch mit


class Test
{
    public string hardwareComputerSerial;
}

class InventoryResponse
{
    public Test hardwareComputerSerial;
}

probiert. Passiert genau das Gleiche, nur dass dann der "Exception

Newtonsoft.Json.JsonSerializationException: 'Error converting value "1A2B3C4" to type 'SysteminventoryV2.Api+Test'. Path 'hardwareComputerSerial', line 1, position 43.'

ArgumentException: Could not cast or convert from System.String to SysteminventoryV2.Api+Test.

This exception was originally thrown at this call stack:
[External Code] steht.

Könnt ihr mir bitte sagen, was ich falsch mache und warum eine Zeile weiter unten plötzlich Einfluss auf eine Variable hat, die weiter oben ohne die Zeile weiter unten bereits den richtigen Wert hat, mit der Zeile dann aber nicht mehr?

Erstellt vor 2 Jahren

Danke Abt. Hat geklappt.

Erstellt vor 2 Jahren

Ich habe vor zwei Wochen angefangen mein Projekt auf Github zu laden. Ist aber private.

Nun habe ich weiter gemacht und wollte das Repository aktualisieren. Geht aber nicht, weil angeblich ist mein lokales Repository älter als online Repository auf GitHub. Stimmt aber nicht und selbst wenn wäre mir das egal. Ich kann machen was ich will, ich bekomme es nicht hin das Projekt auf Github zu aktualisieren. Einfach den alten Kram überschreiben. Jemand eine Idee? Kann doch eigentlich nicht so schwer sein? Verwende VS 2022 Community Edition.

Wenn ich erst Pulle gibt es Konflikte. Ich hake dann zwar an, dass ich das eingehende verwenden möchte, kann das aber nirgendwo bestätigen.

Erstellt vor 2 Jahren

Hi,

hast du mal im Debugger per Breakpoint geschaut, was ipv6key zurückgibt?

Ist das wirklich NULL?

Ja, ist "null". (Siehe Anhang) Ich würde es gerne verstehen, unabhängig davon, dass der restliche Code, bzw. Aufbau nicht schön ist. Direkt falsch ist es ja auch nicht.

Erstellt vor 2 Jahren

Folgender Code kommt mir etwas lang vor. Kann man den sinnvoll kürzen?
Außerdem gibt es in Zeile 9 eine NullReferenceException.
Ist auch richtig, denn auf meinem privaten System gibt es den Registry-Eintrag nicht. Aber ich prüfe doch auf "null"? VS sagt aber auch, dass ich nicht prüfe (grün unterstrichen), also prüfe ich offenbar falsch.

Hinzu kommt, dass der gesuchte Schlüssel ein dword ist und keine Zeichenkette. Deswegen muss ich offenbar eine "doppelte Umwandlung" (so nenne ich das mal) vornehmen. Verstehe also nicht, was "(uint)(int)" genau machen.


public static string GetSystemIpv6State()
{
    string SystemIpv6State = "";
    try
    {
        using RegistryKey? ipv6 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(@"SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters");
        if (ipv6 != null)
        {
            object ipv6key = (uint)(int)ipv6.GetValue("DisabledComponents");
            if (ipv6key != null)
            {
                if (ipv6key.ToString() == "4294967295" || ipv6key.ToString() == "255")
                {
                    SystemIpv6State = "Deaktiviert";
                }
                else
                {
                    SystemIpv6State = "Aktiviert";
                }
            }
        }
        else
        {
            SystemIpv6State = "Undefinierter Zustand";
        }
    }
    catch (Exception)
    {
        SystemIpv6State = "Fehler";
    }
    return SystemIpv6State;
}

Erstellt vor 2 Jahren

Wollte mich noch für die Erklärungen bedanken. Hatte sie unterwegs gelesen und dann zu Hause vergessen zu reagieren.

Erstellt vor 2 Jahren

Danke Abt. Du hast mir zwar jetzt den Weg Richtung Lösung gezeigt, aber warum das so ist habe ich trotzdem nicht verstanden.
Ich nutze doch nur eine Abkürzung um die exe aus zu führen und trotzdem ist ein Workingdir notwendig? Was passiert da im Hintergrund?

Erstellt vor 2 Jahren

Ich habe mir ein kleines Tool geschrieben mit dem ich verschiedene cmd-Dateien als Administrator aufrufen kann.
Solange ich die exe aus dem gleichen Verzeichnis starte wo auch die cmd-Dateien liegen funktioniert es. Verwende ich aber die Verknüpfung zur exe werden die cmd-Dateien nicht mehr gefunden. Ich muss die cmd-Dateien dann in das gleiche Verzeichnis wie die Verknüpfung legen. Dann klappt es wieder.

Ich verstehe das nicht. Eine Verknüpfung ist doch nur ein Verweis auf die exe die gestartet wird. Was läuft falsch?


string fileName;
private void BtnMicrosoftSurface_Click(object sender, EventArgs e)
{
    try
    {
        fileName = Path.GetFileName("InstallSurface.cmd");
        Process proc = new Process();
        proc.StartInfo.FileName = fileName;
        proc.StartInfo.UseShellExecute = true;
        proc.StartInfo.Verb = "runas";
        proc.Start();
        Close();
    }
    catch (Exception)
    {
        MessageBox.Show("Datei \"InstallSurface.cmd\" nicht gefunden.", "Fehler",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}