Wie Deserialisieren von JSON-Objekten des richtigen Typs, ohne zu definieren, die Art vor der hand?
Habe ich gesucht, die ähnliche Fragen und konnte Sie nicht finden, etwas, das ganz abgestimmt, was ich suchte.
Neu in C# also Geduld mit mir, bitte.
Habe ich einige json-Dateien, die ich bin, zu Deserialisieren. Ich will die Dateien zu Deserialisieren von Objekten des richtigen Typs, ohne zu definieren, die Art vor der hand. Hier ist mein code:
public class loadJson
{
//path of the file location
public void readJson(string path)
{
//array of files at the path location. right now just reading one file
FileInfo[] files = new DirectoryInfo(path).GetFiles("seleniumExample.json").ToArray();
foreach (FileInfo fi in files)
{
dynamic b1 = null;
using (StreamReader file = new StreamReader(fi.FullName))
{
string fileText = file.ReadToEnd();
//Console.WriteLine(fileText);
try
{
b1 = Newtonsoft.Json.JsonConvert.DeserializeObject(fileText);
}
catch(Exception e)
{
Console.WriteLine("ERROR!!!! " + e.ToString());
}
file.Close();
}
}
}
}
Ich habe eine Reihe von Objekttypen, die ich in der Fütterung in meinem Programm über json-Dateien.
Möchte ich nicht explizit nennen b1 ist ein Gebot, oder ein Client, oder andere bestimmte vordefinierte Klasse. Wenn ich explizit aufrufen b1 ist ein Gebot, lädt er alle die info ganz gut und füllt die richtige Instanz-Variablen.
Aber wenn ich "dynamisch", oder allgemein "Objekt", es kann ' T es herausfinden und nur initialisiert, um ein "Objekt".
Gibt es eine Möglichkeit, um generische Deserialisierung und es haben, erstellen Sie ein Objekt der richtigen Klasse auf der Grundlage der definierten Felder in die json Datei?
Vielen Dank im Voraus für die Hilfe, und ich entschuldige mich, wenn meine Frage ist unglaublich unklar. Wenn dem so ist, bitte lass es mich wissen, wie kann ich helfen, klare jegliche Zweifel. Nochmals vielen Dank.
Is there a way to perform generic deserialization and have it create an object of the correct class based on the fields defined in the json file?
Angenommen Json.Net erraten Sie die richtige Klasse und kehrte das Objekt. Wie würden Sie es in Ihrem code? Sie wissen immer noch nicht, die Art derb1
während dem schreiben des Codes.- So, mein denken ist: Statt zu schreiben, eine dieser readJson () - Methoden für jede Klasse, die werde ich potenziell feed in mein Programm als eine JSON-Datei, ich dachte, ich könnte einfach in eine generische Mode-und nicht wiederverwenden zu viel code. Macht das nicht Sinn? Wieder, ich bin neu in c# und software-Entwicklung im Allgemeinen, so bin ich offen für die Idee, dass dies vielleicht nicht der beste Weg zu gehen.
- Sie haben die Möglichkeit, Einfluss auf das format & Inhalt der JSON-Dateien? Oder sind Sie einem bestimmten?
- Ich habe die Fähigkeit, das format und die Inhalte.
- Tun alle JSON-Dateien im Verzeichnis speichern Objekte gleichen Typs?
- Nein. und das ist, warum ich wollen in der Lage sein zu Deserialisieren in einer generischen Weise.
- Dann hat
TypeNameHandling = TypeNameHandling.Auto
Ihre Bedürfnisse zu erfüllen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Json.NET hat die Fähigkeit zu erfassen die .Net-Objekt Typ des polymorphen Typen bei der Serialisierung mithilfe der Einstellung
TypeNameHandling = TypeNameHandling.Auto
. Wenn die Einstellung aktiviert ist .Net Art von polymorphe Objekte erscheinen als synthetische Eigenschaft namens"$type"
, zum Beispiel:Jedoch die
"$type"
Eigenschaft ist nie emittiert, für die root - Objekt rufen Sie die herkömmlichen MethodenJsonConvert.SerializeObject(Objekt)
oderJsonSerializer.Serialize(TextWriter, Object)
. Stattdessen müssen Sie eine der Serialisierung Methoden, die akzeptiert ein "erwartet" root geben Sie beispielsweiseSerializeObject(Object, Type, JsonSerializerSettings)
oderJsonSerializer.Serialize(TextWriter, Object, Type)
. Vorbeitypeof(object)
als die erwarteten Typ garantiert die type-Eigenschaft wird angezeigt:Beim erstellen von JSON-Dateien mit dieser Einstellung wird die JSON selbst werden sich erinnern, den Typ des Objekts serialisiert. Dieser Typ wird verwendet durch Json.NET bei der Deserialisierung, wie lange, wie Sie die Verwendung von set
TypeNameHandling
auf etwas anderes alsTypeNameHandling.None
. z.B.:Beispiel arbeiten .Net fiddle hier.
Einschränkungen: diese Art der Speicherung .Net-Typen in JSON ist flippig. Andere serialisierungsprogramme wie
DataContractJsonSerializer
nicht Bearbeiten geben Sie die Informationen in diesem format.Beachten Sie auch diese Vorsicht aus der Newtonsoft docs:
Für eine Diskussion, warum dies notwendig sein kann, sehen TypeNameHandling Vorsicht in Newtonsoft Json, Konfigurieren Json.NET erstellen Sie eine verwundbare web-API, und Alvaro Muñoz & Oleksandr Mirosh ist blackhat-Papier https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf.
$type
, die nicht-generischeDeserializeObject
überlast wird (zumindest für das root-Objekt) nicht, verwenden Sie den Konverter. Siehe meine Frage hier: stackoverflow.com/questions/50374760/...DeserializeObject
gibt, dass die Art (und nicht e.g JToken), siehe das Beispiel in der anderen Frage, weiter oben verlinkt"$type"
. Ich habe einen link zu einer aktualisierten tüfteln, um das Verhalten zu bestätigen.Deserialisieren Ihre JSON-in der einfachsten form:
Den Aufruf
Deserialize()
erstellt einen Baum vonDictionary<string, object>
dass Sie können Durchlaufen werden.