Dies ist ein Beispiel für die JSON-Datei:Wie ein dynamisch namens Wurzelknoten mit json.NET deserialisieren
{
"John Smith": {
"id": "72389",
"email": "[email protected]",
"books": [
{
"id": "0",
"title": "The Hunger Games",
"rating": "5"
},
{
"id": "1",
"title": "Harry Potter and the Order of the Phoenix",
"rating": "3"
},
],
"magazines": [
{
"id": "2",
"title": "National Geographic",
"rating": "1"
},
{
"id": "3",
"title": "Wired",
"rating": "4"
}
],
}
}
Beachten Sie den Wurzelknoten einen dynamischen Namen (John Smith) hat, und jedes json Ich muss deserialize wird einen anderen Namen haben. Diese json Struktur erfordern würde Klassen-Setup haben, wie folgt:
public class RootObject
{
public JohnSmith { get; set; }
}
public class JohnSmith //oops
{
public string id { get; set; }
public string email { get; set; }
public List<Book> books { get; set; }
public List<Magazine> magazines { get; set; }
}
public class Book
{
public string id { get; set; }
public string title { get; set; }
public string rating { get; set; }
}
public class Magazine
{
public string id { get; set; }
public string title { get; set; }
public string rating { get; set; }
}
Mein Ziel ist es „Umgehen/ignorieren“ root Objekt deserialisieren und was am wichtigsten ist, dass dynamicaly namens Knoten. Das ist nicht entscheidend, aber ich möchte den Nachnamen erhalten und als Eigenschaft der Person-Klasse festlegen können.
public class Person
{
public string id { get; set; }
public string email { get; set; }
public string name { get; set; }
public List<Book> books { get; set; }
public List<Magazine> magazines { get; set; }
}
public class Book
{
public string id { get; set; }
public string title { get; set; }
public string rating { get; set; }
}
public class Magazine
{
public string id { get; set; }
public string title { get; set; }
public string rating { get; set; }
}
Hier ist, wie ich das jetzt tue:
var jo = JObject.Parse(json);
var deserializable = jo.First.First.ToString();
string name;
var jp = (JProperty)jo.First;
if (jp != null) name = jp.Name;
var person = JsonConvert.DeserializeObject<Person>(deserializable);
person.name = name;
Dies funktioniert OK, aber ich habe mich gefragt, vielleicht könnte es mithilfe einer benutzerdefinierten JsonConverter besser gemacht werden? Ich fürchte, das ist ein bisschen über meinem Kopf, also frage ich hier nach etwas Hilfe ...
Wie auch immer, wenn es einen besseren Weg gibt, dies zu erreichen, bitte teilen.
+1 Ich mag Ihre Antwort besser als meine. – codenheim
Wie kann ich den Namen der Haupteigenschaft erhalten? –
@RoyiNamir Ich bin mir nicht sicher, was du wissen willst. Sie möchten den Namen welcher Eigenschaft genau bekommen? Das JSON-Beispiel von cryodream hat nur eine Person (= eine Eigenschaft im Hauptobjekt). Mein Code iteriert alle Eigenschaften des Hauptobjekts. Aber mit dem Beispiel JSON gibt es natürlich nur eine Iteration. Also in meinem Code gibt es keine _main property_. Alle Eigenschaften des Wurzelobjekts werden gleich behandelt (in den foreach-Schleifen). – fero