Verwirrt über die Verwendung von JSON in C #

9

Die Antwort auf fast jede Frage zur Verwendung von C # mit JSON scheint "JSON.NET zu verwenden", aber das ist nicht die Antwort, nach der ich suche.

Der Grund dafür ist, dass JSON.NET nach allem, was ich in der Dokumentation lesen konnte, im Grunde nur eine leistungsfähigere Version des DataContractSerializers ist, der in das .NET-Framework integriert ist ...

Was bedeutet, wenn ich eine JSON-Zeichenfolge deserialisieren möchte, muss ich die vollständige, stark typisierte Klasse für JEDE Anfrage definieren, die ich haben könnte. Wenn ich also Kategorien, Posts, Autoren, Tags usw. brauche, muss ich für jedes dieser Dinge eine neue Klasse definieren.

Das ist in Ordnung, wenn ich den Client erstellt habe und genau weiß, wie die Felder sind, aber ich benutze die API von jemand anderem, also habe ich keine Ahnung, was der Vertrag ist, wenn ich nicht einen Beispiel-Antwort-String herunterlade und die Klasse manuell erstelle die JSON-Zeichenfolge.

Ist das der einzige Weg, es zu tun? Gibt es keine Möglichkeit, eine Art Hashtabelle zu erstellen, die mit json ["propertyname"] gelesen werden kann?

Schließlich, wenn ich die Klassen selbst erstellen muss, was passiert, wenn sich die API ändert und sie es mir nicht sagen (da Twitter dafür berüchtigt zu sein scheint)? Ich schätze mein ganzes Projekt wird brechen, bis ich hineingehe und die Objekteigenschaften aktualisiere ...

Was genau ist der allgemeine Arbeitsablauf bei der Arbeit mit JSON? Und allgemein meine ich Bibliotheks-Agnostiker. Ich möchte wissen, wie es im Allgemeinen gemacht wird, nicht speziell für eine Zielbibliothek ...

    
SelAromDotNet 01.06.2010, 15:15
quelle

2 Antworten

5

Es ist sehr schwer, bei der Anfrage bibliotheksunabhängig zu sein, denn wie Sie mit json arbeiten, hängt von der verwendeten Bibliothek ab. Als ein Beispiel in JSON.NET gibt es mehrere Möglichkeiten, mit JSON zu arbeiten. Es gibt die Methode, über die Sie mit direkter Serialisierung in Objekte sprechen. Das ist typsicher, bricht aber, wenn sich die Daten von Ihrer API ändern. Es gibt jedoch auch einen LINQ-zu-JSON, der ein JObject (das sich ziemlich ähnlich wie XElement verhält) bereitstellt, das eine Möglichkeit bietet, JObject ["key"] so auszuführen, wie Sie es in Ihrer Frage angefordert haben. Wenn Sie wirklich nur nach einer flexiblen Möglichkeit suchen, mit JSON innerhalb von C # zu arbeiten, dann schauen Sie sich JSON.NETs LINQ-zu-JSON an.

In der Realität, egal wie Sie es tun, wenn die API Änderungen Ihr Code wird wahrscheinlich brechen. Selbst wenn Sie nur einen Hashtabellen-basierten Ansatz verfolgen, wird Ihr Code wahrscheinlich immer wieder beschädigt, wenn sich die Daten ändern.

Bearbeiten

JSON.NET-Dokumentation

Beispiele

Wenn Sie sich die Beispiele ansehen, sollte Ihnen das zweite ein gutes Beispiel dafür geben, wie LINQ-to-JSON funktioniert. Sie können damit arbeiten, ohne Klassen zu definieren. Alles wird in Standard-Framework-Klassen (meist Collections und Strings) konvertiert. Dies vermeidet die Notwendigkeit, Klassen zu pflegen.

    
Stephan 01.06.2010, 15:30
quelle
0

Ich bin seit über einem Jahrzehnt Perl-Entwickler und arbeite seit kurzem in C #. Ich bin überrascht, wie sehr ich es mag (ich mag Java überhaupt nicht), aber einer der schwierigsten kognitiven Schalter geht von "Alles kann als String behandelt werden und die Sprache kümmert sich um Konvertierungen" zu "Pre -definiere deine Typen. " In diesem Fall ist String-Thinking möglicherweise von Vorteil, da Sie genau das tun müssen, was Sie von der API erwarten.

Sie müssen einen JSON-Parser schreiben, der die Syntax versteht, was ziemlich einfach ist: durch Komma getrennte Listen, Schlüssel / Wert-Paare, { } für Hashes / Objekte, [] für Arrays und Quoting / Escape-Konstrukte. Sie sollten eine Hashtabelle erstellen, die gestartet werden soll, da die Entität auf oberster Ebene in JSON immer ein Objekt ist und dann die JSON-Zeichenfolge Zeichen für Zeichen durchsucht. Ziehen Sie Schlüssel / Wert-Paare heraus; Wenn der Wert mit {beginnt, dann fügen Sie ihn als neue Hashtabelle hinzu, wenn er mit [als neue ArrayListe hinzufügen] beginnt, andernfalls fügen Sie ihn als Zeichenfolge hinzu. Wenn Sie {oder [erhalten, müssen Sie rekursiv absteigen, um die untergeordneten Datenelemente hinzuzufügen.

Wenn .NET einen guten rekursiven Descent-Parser hat, könnten Sie das wahrscheinlich verwenden, um den Job einfacher oder robuster zu machen, aber JSON ist einfach genug, um dies zu einer guten und vernünftigen Aufgabe zu machen.

    
DougWebb 01.06.2010 16:17
quelle