Ich erhalte eine JSON-Zeichenfolge in C # wie folgt:

{
    "Id": "617723",
    "Acronym": "",
    "FirstName": "XXXXX",
    "LastName": "XXXXX",
    "Groupe": {
        "Code": "XXXXX",
        "Traductions": {
            "French": "",
            "English": "XXXXX"
        }
    },
    "BusinessUnit": {
        "Code": "XXXXX",
        "Traductions": {
            "French": "",
            "English": "XXXXX"
        }
    },
    "Team": {
        "Code": null,
        "Traductions": {
            "French": "",
            "English": null
        }
    },
    "Title": {
        "Code": null,
        "Traductions": {
            "French": "",
            "English": "XXXXX"
        }
    },
    "Title2": {
        "Code": null,
        "Traductions": {
            "French": "",
            "English": null
        }
    },
    "JobCategory": {
        "Code": "XXXXX",
        "Traductions": {
            "French": "",
            "English": "XXXXX"
        }
    },
    "PhoneList": [],
    "DateHired": "XXXXX",
    "DateTerminated": "XXXXX",
    "Gender": "XXXXX",
    "ManagerId": "XXXXX",
    "ManagerAcronym": "XXXXX",
    "IsManager": false,
    "Email": null,
    "CarLicense": null,
    "MyTeam": [],
    "HomeBase": {
        "Code": "XXXXX",
        "Traductions": {
            "French": "XXXXX",
            "English": "XXXXX"
        }
    },
    "Country": {
        "Code": "XXXXX",
        "Traductions": {
            "French": "XXXXXX",
            "English": "XXXXX"
        }
    },
    "State": {
        "Code": "XXXXX",
        "Traductions": {
            "French": "XXXXX",
            "English": "XXXXX"
        }
    },
    "City": {
        "Code": "XXXXX",
        "Traductions": {
            "French": "XXXXX",
            "English": "XXXXX"
        }
    },
    "ShirtSize": "",
    "LanguageAddressBook": "XXXXX",
    "LanguagePrefered": null,
    "Local": null,
    "Mailbox": null,
    "HomeBusinessUnit": "1",
    "JobType": "XXXXXX",
    "UnionCode": "",
    "ProfessionalTitle": {
        "Code": null,
        "Traductions": {
            "French": "",
            "English": null
        }
    },
    "IconEmailActif": true,
    "IconSkypeActif": true
}

Ich möchte es in ein C # -Objekt konvertieren, also habe ich mein Modell folgendermaßen erstellt:

public class UsersJson
{
    public string Acronym { get; set; }

    public string[] BusinessUnit { get; set; }

    public string CarLicense { get; set; }

    public string[] City { get; set; }

    public string[] Country { get; set; }

    public string DateHired { get; set; }

    public string DateTerminated { get; set; }

    public string Email { get; set; }

    public string FirstName { get; set; }

    public string Gender { get; set; }

    public string[] Groupe { get; set; }

    public string[] HomeBase { get; set; }

    public string HomeBusinessUnit { get; set; }

    public bool IconEmailActif { get; set; }

    public bool IconSkypeActif { get; set; }

    public string Id { get; set; }

    public bool IsManager { get; set; }

    public string[] JobCategory { get; set; }

    public string JobType { get; set; }

    public string LanguageAddressBook { get; set; }

    public string LanguagePrefered { get; set; }

    public string LastName { get; set; }

    public string Local { get; set; }

    public string Mailbox { get; set; }

    public string ManagerAcronym { get; set; }

    public string ManagerId { get; set; }

    public string[] MyTeam { get; set; }

    public string[] PhoneList { get; set; }

    public string[] ProfessionalTitle { get; set; }

    public string ShirtSize { get; set; }

    public string[] State { get; set; }

    public string[] Team { get; set; }

    public string[] Title { get; set; }

    public string[] Title2 { get; set; }

    public string UnionCode { get; set; }
}

Wenn ich versuche, es in ein List<UsersJson> zu deserialisieren, wird folgende Fehlermeldung angezeigt:

Das aktuelle JSON-Objekt (z. B. {"Name": "Wert"}) kann nicht in den Typ "System.String []" deserialisiert werden, da für den Typ ein JSON-Array (z. B. [1,2,3]) zum Deserialisieren erforderlich ist korrekt. Um diesen Fehler zu beheben, ändern Sie entweder den JSON in ein JSON-Array (z. B. [1,2,3]) oder den deserialisierten Typ so, dass es sich um einen normalen .NET-Typ handelt (z. B. keinen primitiven Typ wie Integer, keinen Auflistungstyp wie ein Array oder eine Liste), die von einem JSON-Objekt deserialisiert werden kann. JsonObjectAttribute kann dem Typ auch hinzugefügt werden, um die Deserialisierung von einem JSON-Objekt zu erzwingen. Pfad '[0] .Groupe.Code', Zeile 1, Position 87. "

Wie soll ich die Eigenschaft Group deklarieren, wenn es sich nicht um eine string[] handelt?

-1
Alex Caron 16 Apr. 2018 im 16:40

4 Antworten

Beste Antwort

Verwenden Sie die richtigen Klassen. Ich habe die hier beschriebenen Schritte befolgt und ein wenig überarbeitet:

RootObject r = JsonConvert.DeserializeObject<RootObject>(json);

public class Traductions
{
    public string French { get; set; }
    public string English { get; set; }
}

public class Groupe
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class BusinessUnit
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class Team
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class Title
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class JobCategory
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class HomeBase
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class Country
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class State
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class City
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class ProfessionalTitle
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class RootObject
{
    public string Id { get; set; }
    public string Acronym { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Groupe Groupe { get; set; }
    public BusinessUnit BusinessUnit { get; set; }
    public Team Team { get; set; }
    public Title Title { get; set; }
    public Title Title2 { get; set; }
    public JobCategory JobCategory { get; set; }
    public List<object> PhoneList { get; set; }
    public string DateHired { get; set; }
    public string DateTerminated { get; set; }
    public string Gender { get; set; }
    public string ManagerId { get; set; }
    public string ManagerAcronym { get; set; }
    public bool IsManager { get; set; }
    public string Email { get; set; }
    public string CarLicense { get; set; }
    public List<object> MyTeam { get; set; }
    public HomeBase HomeBase { get; set; }
    public Country Country { get; set; }
    public State State { get; set; }
    public City City { get; set; }
    public string ShirtSize { get; set; }
    public string LanguageAddressBook { get; set; }
    public string LanguagePrefered { get; set; }
    public string Local { get; set; }
    public string Mailbox { get; set; }
    public string HomeBusinessUnit { get; set; }
    public string JobType { get; set; }
    public string UnionCode { get; set; }
    public ProfessionalTitle ProfessionalTitle { get; set; }
    public bool IconEmailActif { get; set; }
    public bool IconSkypeActif { get; set; }
}
1
Patrick Hofman 16 Apr. 2018 im 13:46

Sie benötigen weitere Klassen mit den Eigenschaften Code und Traductions.

public class Groupe {
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class Traductions {
    public string French { get; set; }
    public string English { get; set; }
}

Verwenden Sie Groupe anstelle von string[] in Ihrer Basisklasse und Sie sollten golden sein :)

0
phuzi 16 Apr. 2018 im 13:49

Die akzeptierte Antwort funktioniert, aber ich denke, es gibt viele Code-Wiederholungen. Sie benötigen nur zwei weitere Modellklassen, damit dies funktioniert:

public class Traductions
{
    public string French { get; set; }
    public string English { get; set; }
}

public class CodeTraduction
{
    public string Code { get; set; }
    public Traductions Traductions { get; set; }
}

public class RootObject
{
    public string Id { get; set; }
    public string Acronym { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public CodeTraduction Groupe { get; set; }
    public CodeTraduction BusinessUnit { get; set; }
    public CodeTraduction Team { get; set; }
    public CodeTraduction Title { get; set; }
    public CodeTraduction Title2 { get; set; }
    public CodeTraduction JobCategory { get; set; }
    public List<object> PhoneList { get; set; }
    public string DateHired { get; set; }
    public string DateTerminated { get; set; }
    public string Gender { get; set; }
    public string ManagerId { get; set; }
    public string ManagerAcronym { get; set; }
    public bool IsManager { get; set; }
    public string Email { get; set; }
    public string CarLicense { get; set; }
    public List<object> MyTeam { get; set; }
    public CodeTraduction HomeBase { get; set; }
    public CodeTraduction Country { get; set; }
    public CodeTraduction State { get; set; }
    public CodeTraduction City { get; set; }
    public string ShirtSize { get; set; }
    public string LanguageAddressBook { get; set; }
    public string LanguagePrefered { get; set; }
    public string Local { get; set; }
    public string Mailbox { get; set; }
    public string HomeBusinessUnit { get; set; }
    public string JobType { get; set; }
    public string UnionCode { get; set; }
    public CodeTraduction ProfessionalTitle { get; set; }
    public bool IconEmailActif { get; set; }
    public bool IconSkypeActif { get; set; }
}

Mit Ihrem Beispiel-JSON würden Sie es folgendermaßen deserialisieren:

var item = JsonConvert.DeserializeObject<RootObject>(json);

Sie können auf Wunsch separate Klassen erstellen, aber eine einzelne Basisklasse CodeTraduction beibehalten, zum Beispiel:

public class Groupe : CodeTraduction
{
    //Add any "Groupe" specific properties here
}
0
Ron Beyer 16 Apr. 2018 im 14:09

Zum späteren Nachschlagen können Sie auch Paste Special verwenden. Sie kopieren die JSON-Datei ( Strg + C ) und fügen eine neue Klassendatei hinzu, falls Sie noch keine haben. Gehen Sie dann zu Bearbeiten (oben links in VS) und bewegen Sie den Mauszeiger über "Inhalte einfügen". Sie erhalten zwei Optionen, eine für XML als Klasse oder JSON als Klasse. Hoffe, es hilft Ihnen und anderen in der Zukunft. :) :)

0
Jesper Engdahl 16 Apr. 2018 im 14:39