Können Sie eine Objektinstanz aus JSON in .NET instanziieren?

8

Da Objekt-Initialisierer JSON sehr ähnlich sind, gibt es jetzt anonyme Typen in .NET. Es wäre cool, eine Zeichenfolge wie JSON zu verwenden und ein anonymes Objekt zu erstellen, das die JSON-Zeichenfolge darstellt.

Verwenden Sie Objektinitialisierer, um einen anonymen Typ zu erstellen:

%Vor%

Es wäre toll, wenn Sie eine String-Repräsentation des Object Initializer-Codes (vorzugsweise etwas wie JSON) übergeben könnten, um eine Instanz eines anonymen Typs mit diesen Daten zu erstellen.

Ich weiß nicht, ob das möglich ist, da C # nicht dynamisch ist und der Compiler den Objektinitialisierer tatsächlich um Anonym Geben Sie in stark typisierten Code ein, der ausgeführt werden kann. Dies wird in diesem Artikel erklärt.

Vielleicht wäre die Funktionalität, JSON zu verwenden und ein Schlüssel / Wert-Dictionary zu erstellen, am besten.

Ich weiß, dass Sie ein Objekt zu JSON in .NET serialisieren / deserialisieren können, aber was ich suche, ist eine Möglichkeit, ein Objekt zu erstellen, das im Wesentlichen lose typisiert ist, ähnlich wie JavaScript funktioniert.

Kennt jemand die beste Lösung dafür in .NET?

UPDATE: Um den Zusammenhang zu erklären, warum ich das frage ... Ich habe darüber nachgedacht, wie C # JSON besser auf dem Sprachniveau unterstützen könnte (möglicherweise) und ich versuchte darüber nachzudenken, wie es heute gemacht werden könnte aus konzeptionellen Gründen. Also dachte ich, ich würde es hier posten, um eine Diskussion zu beginnen.

    
Chris Pietschmann 14.10.2008, 01:30
quelle

5 Antworten

6

Es gibt Sprachen für .NET, die Duck-Typing haben, aber bei C # mit Dot.Notation ist das nicht möglich, da C # erfordert, dass alle Mitgliedsreferenzen zur Kompilierungszeit aufgelöst werden. Wenn Sie die Dot.Notation verwenden möchten, müssen Sie noch eine Klasse mit den erforderlichen Eigenschaften definieren und die Methode verwenden, mit der Sie die Klasse aus den JSON-Daten instanziieren möchten. Vordefinieren einer Klasse hat Vorteile wie starke Typisierung, IDE-Unterstützung einschließlich Intellisense und keine Angst vor Rechtschreibfehlern. Sie können weiterhin anonyme Typen verwenden:

%Vor%     
Mark Cidade 14.10.2008, 02:13
quelle
5

Sie sollten das JSON.net -Projekt ausprobieren:

Ссылка

Sie sprechen im Grunde von der Fähigkeit, ein Objekt von JSON zu hydratisieren, was dies tun wird. Es wird nicht die anonymen Typen tun, aber vielleicht bringt es dich nahe genug.

    
Jason Jackson 14.10.2008 02:26
quelle
4

Ich habe eine relativ kurze Methode geschrieben, die JSON parsen und ein Name / Wert-Dictionary zurückgeben wird, auf das ähnlich wie das eigentliche Objekt in JavaScript zugegriffen werden kann.

Hier ist eine Beispielverwendung der folgenden Methode:

%Vor%

Und hier ist der Code für die ParseJsonToDictionary-Methode:

%Vor%

Ich weiß, dass diese Methode vielleicht ein bisschen grob ist, und sie könnte wahrscheinlich ziemlich optimiert werden, aber es ist der erste Entwurf und es funktioniert einfach.

Bevor Sie sich darüber beschweren, dass keine regulären Ausdrücke verwendet werden, sollten Sie nicht vergessen, dass nicht jeder reguläre Ausdrücke wirklich versteht. Wenn Sie es so schreiben, wird es für andere schwieriger, es zu korrigieren. Außerdem kenne ich den regulären Ausdruck derzeit nicht so gut, und das Parsen von Strings war einfach einfacher.

    
Chris Pietschmann 14.10.2008 03:24
quelle
1

Sie können keinen anonymen Typ aus einer Methode ** zurückgeben, so dass die Existenz eines "rehydrierten" anonymen Typs auf die Methode beschränkt wäre, in der es rehydriert wird. Irgendwie sinnlos.

** Du kannst es als ein Objekt zurückgeben (das erfordert Reflektion, um auf seine Eigenschaften zugreifen zu können - yeech) oder du kannst es "mit Beispiel" darstellen, was sinnlos ist, da es zusätzliche Schritte erfordert und dich bereits bedeutet WISSEN, wie der Objekttyp aussehen sollte, also warum nicht einfach ein Objekt erstellen und es an erster Stelle ausfüllen?

    
Will 14.10.2008 03:24
quelle
0

Was ist die Anwendung dafür?

Ich würde diesen Weg aus ein paar Gründen nicht gehen.

  • Erstens; Es kann eine Menge an unterstützendem Code erfordern, der Reflektion verwendet, und so die transparente Methode zu erstellen, über die Sie sprechen.

  • Zweitens, wie du schon sagtest, ist C # eine stark typisierte Sprache und Dinge wie diese wurden aus einem Grund nicht in der Sprachspezifikation angegeben.

  • Drittens wäre der Aufwand dafür nicht wert. Denken Sie daran, dass Webseiten (insbesondere AJAX-Abfragen) sehr schnell sein sollten oder den Zweck verfehlen. Wenn Sie fortfahren und 50% serialisieren Ihre Objekte zwischen C # und Javascript dann haben Sie ein Problem.

Meine Lösung wäre, eine Klasse zu erstellen, die nur ein Wörterbuch einkapselt und eine JSON-Zeichenfolge als ein ctor-Argument verwendet. Erweitern Sie dann diese Klasse für jeden JSON-Abfragetyp, den Sie behandeln möchten. Dies wird eine stark typisierte und schnellere Lösung sein, aber immer noch Erweiterbarkeit und Benutzerfreundlichkeit beibehalten. Der Nachteil ist, dass es mehr Code zum Schreiben pro JSON-Anforderungstyp gibt.

:)

    
nlaq 14.10.2008 01:49
quelle