Parfois, nous avons besoin de LLM (grands modèles de langue) pour produire des informations structurelles au lieu du langage naturel. Le moyen le plus simple est d'utiliser JSON.
Mais avant de recevoir le dernier jeton de réponse, le JSON est cassé, ce qui signifie que vous ne pouvez pas utiliser JSON.parse
pour le décoder. Mais nous voulons toujours diffuser les données à l'utilisateur.
Voici partial-json
, une bibliothèque légère et personnalisable pour analyser les cordes JSON partielles. Voici une démo.
(Notez qu'il y a aussi une implémentation Python)
npm i partial-json # or pnpm / bun / yarn
partial-json
est implémenté uniquement en JavaScript et a à la fois commonjs
et esm
Builds.
Vous pouvez importer la fonction parse
et l'objet Allow
de la bibliothèque comme ceci:
import { parse , Allow } from "partial-json" ;
L'objet Allow
n'est qu'une énumération pour les options. Il détermine quels types peuvent être partiels. Les types non inclus dans allow
apparaissent uniquement une fois que son achèvement peut être assuré.
La fonction parse
fonctionne comme le JSON.parse
intégré lors de l'analyse d'une chaîne JSON complète:
let result = parse ( '{"key":"value"}' ) ;
console . log ( result ) ; // Outputs: { key: 'value' }
Vous pouvez analyser une chaîne JSON partielle en passant un paramètre supplémentaire à la fonction parse
. Ce paramètre est un peu ou des constantes de l'objet Allow
:
(Notez que vous pouvez importer directement les constantes dont vous avez besoin de partial-json
)
import { parse , STR , OBJ } from "partial-json" ;
result = parse ( '{"key": "v' , STR | OBJ ) ;
console . log ( result ) ; // Outputs: { key: 'v' }
Dans cet exemple, Allow.STR
dit à l'analyseur que ça va si une chaîne est incomplète, et Allow.OBJ
raconte à l'analyseur ainsi en tant qu'objet. L'analyseur essaie ensuite de renvoyer autant de données que possible.
Si vous n'autorisez pas les chaînes partielles, cela n'ajoutera pas "key"
à l'objet car "v
n'est pas proche:
result = parse ( '{"key": "v' , OBJ ) ;
console . log ( result ) ; // Outputs: {}
result = parse ( '{"key": "value"' , OBJ ) ;
console . log ( result ) ; // Outputs: { key: 'value' }
Similitude, vous pouvez analyser des tableaux partiels ou même des valeurs spéciales partielles si vous le permettez:
(Remarque qui allow
aux valeurs par défaut de Allow.ALL
.
result = parse ( '[ {"key1": "value1", "key2": [ "value2' ) ;
console . log ( result ) ; // Outputs: [ { key1: 'value1', key2: [ 'value2' ] } ]
result = parse ( "-Inf" ) ;
console . log ( result ) ; // Outputs: -Infinity
Si la chaîne JSON est mal formée, la fonction parse
lancera une erreur:
parse ( "wrong" ) ; // MalformedJSON [Error]: SyntaxError: Unexpected token 'w', "wrong" is not valid JSON at position 0
jsonString
<string>
: la chaîne JSON à analyser.allowPartial
<number>
: Spécifiez quel type de partiel est autorisé lors de l'analyse JSON (par défaut: Allow.ALL
).Renvoie la valeur JavaScript analysée.
Un objet qui spécifie quel type de partiel est autorisé pendant l'analyse JSON. Il a les propriétés suivantes:
STR
: Autoriser la chaîne partielle.NUM
: Autorisez le numéro partiel.ARR
: Autoriser le tableau partiel.OBJ
: Autoriser l'objet partiel.NULL
: Autorisez Null partiel.BOOL
: Autorisez le booléen partiel.NAN
: Autoriser le NAN partiel.INFINITY
: Autoriser l'infini partiel._INFINITY
: Autorisez -Infinity partiel.INF
: Permettez à la fois l'infini partiel et la finfinity.SPECIAL
: permettez toutes les valeurs spéciales.ATOM
: Autorisez toutes les valeurs atomiques.COLLECTION
: permettez toutes les valeurs de collecte.ALL
: permettez toutes les valeurs. Pour exécuter les tests pour cette bibliothèque, vous devez cloner le référentiel et installer les dépendances:
git clone https://github.com/promplate/partial-json-parser-js.git
cd partial-json-parser-js
npm i
Ensuite, vous pouvez exécuter les tests en utilisant Virest:
npm run test
Veuillez noter que même si nous nous efforçons de couvrir autant de cas de bord que possible, il est toujours possible que certains cas ne soient pas couverts.
Ce projet est autorisé sous la licence du MIT.