Gibt es eine Möglichkeit, Zeichenfolgen als JSON in Typescript zu analysieren?
Beispiel: In JS können wir verwenden JSON.parse()
. Gibt es eine ähnliche Funktion in Typescript?
Ich habe eine JSON-Objektzeichenfolge wie folgt:
{"name": "Bob", "error": false}
javascript
json
string
typescript
ssd20072
quelle
quelle
JSON.parse
Sie ein Objekt als Ergebnis und nicht einstring
(siehe meine Antwort für mehr). Wenn Sie ein Objekt in eine Zeichenfolge verwandeln möchten, müssen SieJSON.stringify
stattdessen verwenden.Antworten:
Typoskript ist (eine Obermenge von) Javascript, also verwenden Sie es einfach
JSON.parse
wie in Javascript:Nur dass Sie im Typoskript einen Typ für das resultierende Objekt haben können:
( Code auf dem Spielplatz )
quelle
'{ "myString": "string", "myNumber": 4 }'
durch'{ "myString": "string", "myNumberBAD": 4 }'
schlägt nicht fehl und obj.myNumber gibt undefiniert zurück.Json.parse(text).validate[MyObj]
. playframework.com/documentation/2.6.x/ScalaJson Wie können Sie dasselbe in Typoskript tun (möglicherweise gibt es eine externe Bibliothek, um dies zu tun?)?MyObj
nicht existiert. Es gibt viele andere Threads in SO zu diesem Thema, zum Beispiel: Überprüfen Sie, ob ein Objekt zur Laufzeit eine Schnittstelle mit TypeScript implementiertWenn Ihr JSON einen validierten Typescript-Typ haben soll, müssen Sie diese Validierungsarbeit selbst ausführen. Das ist nichts Neues. In einfachem Javascript müssten Sie dasselbe tun.
Validierung
Ich möchte meine Validierungslogik als eine Reihe von "Transformationen" ausdrücken. Ich definiere a
Descriptor
als Karte von Transformationen:Dann kann ich eine Funktion erstellen, die diese Transformationen auf beliebige Eingaben anwendet:
Jetzt validiere ich nicht nur meine JSON-Eingabe, sondern baue auch unterwegs einen Typescript-Typ auf. Die oben genannten generischen Typen stellen sicher, dass das Ergebnis die Typen aus Ihren "Transformationen" ableitet.
Falls die Transformation einen Fehler auslöst (so würden Sie die Validierung implementieren), möchte ich sie mit einem weiteren Fehler umschließen, der anzeigt, welcher Schlüssel den Fehler verursacht hat.
Verwendung
In Ihrem Beispiel würde ich dies wie folgt verwenden:
Jetzt
value
wird getippt, daString
undBoolean
beide "Transformatoren" in dem Sinne sind, dass sie Eingaben nehmen und eine getippte Ausgabe zurückgeben.Darüber hinaus ist der
value
Wille tatsächlich , dass Art. Mit anderen Worten, wenn diesname
tatsächlich der123
Fall wäre , wird es so transformiert,"123"
dass Sie eine gültige Zeichenfolge haben. Dies liegt daran, dass wir zurString
Laufzeit eine integrierte Funktion verwendet haben, die beliebige Eingaben akzeptiert und a zurückgibtstring
.Sie können dies hier sehen . Versuchen Sie Folgendes, um sich selbst zu überzeugen:
const value
Definition, um anzuzeigen, dass im Popup der richtige Typ angezeigt wird."Bob"
auf123
und die Probe erneut aus. In Ihrer Konsole sehen Sie, dass der Name ordnungsgemäß in die Zeichenfolge konvertiert wurde"123"
.quelle
name
tatsächlich der123
Fall wäre , wird es in umgewandelt"123"
. Dies scheint falsch zu sein. Meinesvalue
kommt{name: 123..
nicht zurück,{name:"123"..
wenn ich Ihren gesamten Code kopiere, genau123
anstelle von"Bob"
).Transformed
Typ definieren müssen . Sie können einfach verwendenObject
.type Descriptor<T extends Object> = { ... };
Transformed
Typ ist völlig unnötig. Ich habe die Antwort entsprechend aktualisiert.Typensicher
JSON.parse
Sie können weiterhin verwenden
JSON.parse
, da TS eine JS-Obermenge ist. Es gibt immer noch ein Problem:JSON.parse
Rückgabeany
, die die Typensicherheit untergräbt. Hier sind zwei Optionen für stärkere Typen:1. Benutzerdefinierte Typwächter ( Spielplatz )
Type Guards sind die einfachste Lösung und oft ausreichend für die externe Datenvalidierung:
Ein
Anwendungsbeispiel:JSON.parse
Wrapper nimmt dann einen Typschutz als Eingabe und gibt den analysierten, typisierten Wert zurück:safeJsonParse
kann erweitert werden, um schnell zu versagen oderJSON.parse
Fehler zu versuchen / zu fangen .2. Externe Bibliotheken
Das manuelle Schreiben von Typschutzfunktionen wird umständlich, wenn Sie viele verschiedene Werte validieren müssen. Es gibt einige Bibliotheken, die bei dieser Aufgabe helfen - Beispiele (keine umfassende Liste):
io-ts
: rel. beliebt (derzeit 3,2k Sterne),fp-ts
Peer-Abhängigkeit, funktionaler Programmierstilzod
: ganz neu (repo: 2020-03-07), strebt danach, prozeduraler / objektorientierter zu sein alsio-ts
typescript-is
: TS-Transformator für Compiler-API, zusätzlicher Wrapper wie ttypescript erforderlichtypescript-json-schema
/ajv
: JSON-Schema aus Typen erstellen und mit validierenajv
Weitere Infos
quelle
Sie können zusätzlich Bibliotheken verwenden, die eine Typüberprüfung Ihres JSON durchführen, z. B. Sparkson . Mit ihnen können Sie eine TypeScript-Klasse definieren, auf die Sie Ihre Antwort analysieren möchten. In Ihrem Fall könnte dies sein:
Die Bibliothek überprüft, ob die erforderlichen Felder in der JSON-Nutzlast vorhanden sind und ob ihre Typen korrekt sind. Es kann auch eine Reihe von Validierungen und Konvertierungen durchführen.
quelle
Es gibt eine großartige Bibliothek für das ts-json-Objekt
In Ihrem Fall müssten Sie den folgenden Code ausführen:
Diese Bibliothek überprüft den JSON vor dem Parsen
quelle
JSON.parse
ist in TypeScript verfügbar, Sie können es also einfach verwenden:Sie möchten jedoch häufig ein JSON-Objekt analysieren, während Sie sicherstellen, dass es einem bestimmten Typ entspricht, anstatt sich mit einem Wert vom Typ zu befassen
any
. In diesem Fall können Sie eine Funktion wie die folgende definieren:Diese Funktion verwendet eine JSON-Zeichenfolge und ein Objekt, das einzelne Funktionen enthält, die jedes Feld des von Ihnen erstellten Objekts laden. Sie können es so verwenden:
quelle