Existe-t-il un moyen d'analyser les chaînes en tant que JSON dans Typescript.
Exemple: Dans JS, nous pouvons utiliser JSON.parse()
. Existe-t-il une fonction similaire dans Typescript?
J'ai une chaîne d'objet JSON comme suit:
{"name": "Bob", "error": false}
javascript
json
string
typescript
ssd20072
la source
la source
JSON.parse
vous obtenez un objet en conséquence et non unstring
(voir ma réponse pour plus). Si vous souhaitez transformer un objet en chaîne, vous devez utiliser à laJSON.stringify
place.Réponses:
Typescript est (un sur-ensemble de) javascript, vous utilisez donc simplement
JSON.parse
comme vous le feriez en javascript:Seulement que dans dactylographié, vous pouvez avoir un type pour l'objet résultant:
( code dans la cour de récréation )
la source
'{ "myString": "string", "myNumber": 4 }'
par'{ "myString": "string", "myNumberBAD": 4 }'
n'échouera pas et obj.myNumber retournera undefined.Json.parse(text).validate[MyObj]
. playframework.com/documentation/2.6.x/ScalaJson comment pouvez-vous faire la même chose en tapuscrit (peut-être existe-t-il une bibliothèque externe pour le faire?)?MyObj
n'existe pas. Il existe de nombreux autres threads dans SO sur ce sujet, par exemple: Vérifier si un objet implémente une interface au moment de l'exécution avec TypeScriptType-safe
JSON.parse
Vous pouvez continuer à utiliser
JSON.parse
, car TS est un sur-ensemble JS. Il reste un problème: lesJSON.parse
retoursany
, qui sapent la sécurité des types. Voici deux options pour les types plus forts:1. Protections de type défini par l'utilisateur ( terrain de jeu )
Les protections de type personnalisées sont la solution la plus simple et souvent suffisante pour la validation externe des données:
Un
Exemple d'utilisation:JSON.parse
wrapper peut alors prendre un type guard comme entrée et renvoyer la valeur typée analysée:safeJsonParse
peut être étendu pour échouer rapidement ou essayer / attraper desJSON.parse
erreurs.2. Bibliothèques externes
L'écriture manuelle des fonctions de protection de type devient fastidieuse, si vous devez valider de nombreuses valeurs différentes. Il existe des bibliothèques pour vous aider dans cette tâche - exemples (pas de liste complète):
io-ts
: rel. populaire (3,2k étoiles actuellement),fp-ts
dépendance des pairs, style de programmation fonctionnelzod
: tout à fait nouveau (repo: 2020-03-07), s'efforce d'être plus procédural / orienté objet queio-ts
typescript-is
: Transformateur TS pour l'API du compilateur, wrapper supplémentaire comme ttypescript nécessairetypescript-json-schema
/ajv
: Créez un schéma JSON à partir de types et validez-le avecajv
Plus d'infos
la source
Si vous souhaitez que votre JSON ait un type Typecript validé, vous devrez effectuer vous-même ce travail de validation. Cela n’a rien de nouveau. En Javascript simple, vous devrez faire de même.
Validation
J'aime exprimer ma logique de validation comme un ensemble de «transformations». Je définis a
Descriptor
comme une carte de transformations:Ensuite, je peux créer une fonction qui appliquera ces transformations à une entrée arbitraire:
Maintenant, non seulement je valide mon entrée JSON, mais je construis un type Typecript au fur et à mesure. Les types génériques ci-dessus garantissent que le résultat infère les types à partir de vos "transformations".
Au cas où la transformation lèverait une erreur (c'est ainsi que vous implémenteriez la validation), j'aime l'envelopper avec une autre erreur indiquant quelle clé a causé l'erreur.
Usage
Dans votre exemple, j'utiliserais ceci comme suit:
Maintenant
value
sera tapé, puisqueString
etBoolean
sont tous deux des "transformateurs" dans le sens où ils prennent une entrée et retournent une sortie typée.De plus, le
value
sera réellement de ce type. En d'autres termes, siname
c'était réellement123
, il sera transformé en"123"
afin que vous ayez une chaîne valide. C'est parce que nous avons utiliséString
au moment de l'exécution, une fonction intégrée qui accepte une entrée arbitraire et renvoie unstring
.Vous pouvez voir cela fonctionner ici . Essayez les choses suivantes pour vous convaincre:
const value
définition pour voir que la fenêtre contextuelle affiche le type correct."Bob"
à123
et re-exécuter l'exemple. Dans votre console, vous verrez que le nom a été correctement converti en chaîne"123"
.la source
name
c'était effectivement le cas123
, il sera transformé en"123"
. Cela semble être incorrect. Je nevalue
reviens{name: 123..
pas{name:"123"..
quand je copie-collez tout votre code exactement et que123
au lieu de"Bob"
).Transformed
type. Vous pouvez simplement utiliserObject
.type Descriptor<T extends Object> = { ... };
Transformed
type est totalement inutile. J'ai mis à jour la réponse en conséquence.Vous pouvez en outre utiliser des bibliothèques qui effectuent la validation de type de votre json, telles que Sparkson . Ils vous permettent de définir une classe TypeScript, à laquelle vous souhaitez analyser votre réponse, dans votre cas cela pourrait être:
La bibliothèque validera si les champs obligatoires sont présents dans la charge utile JSON et si leurs types sont corrects. Il peut également effectuer un tas de validations et de conversions.
la source
Il existe une excellente bibliothèque pour cela ts-json-object
Dans votre cas, vous devrez exécuter le code suivant:
Cette bibliothèque validera le json avant l'analyse
la source
JSON.parse
est disponible dans TypeScript, vous pouvez donc simplement l'utiliser:Cependant, vous souhaiterez souvent analyser un objet JSON tout en vous assurant qu'il correspond à un certain type, plutôt que de traiter une valeur de type
any
. Dans ce cas, vous pouvez définir une fonction telle que la suivante:Cette fonction prend une chaîne JSON et un objet contenant des fonctions individuelles qui chargent chaque champ de l'objet que vous créez. Vous pouvez l'utiliser comme ceci:
la source