有时,我们需要LLM(大型语言模型)来产生结构信息,而不是自然语言。最简单的方法是使用JSON。
但是,在收到最后一个响应令牌之前,json被打破了,这意味着您不能使用JSON.parse
对其进行解码。但是我们仍然想将数据流式传输给用户。
partial-json
是一个轻巧且可自定义的图书馆,用于解析部分JSON字符串。这是一个演示。
(请注意,也有Python实施)
npm i partial-json # or pnpm / bun / yarn
partial-json
仅在JavaScript中实现,并且具有commonjs
和esm
构建。
您可以从库中导入parse
功能和Allow
对象:
import { parse , Allow } from "partial-json" ;
Allow
对象只是选项的枚举。它决定哪种类型可以部分。仅在完成后才出现allow
包含的类型才能确保。
解析完整的JSON字符串时, parse
功能就像内置的JSON.parse
一样工作:
let result = parse ( '{"key":"value"}' ) ;
console . log ( result ) ; // Outputs: { key: 'value' }
您可以通过将附加参数传递到parse
功能来解析部分JSON字符串。此参数是从Allow
对象的位或常数的。
(请注意,您可以直接从partial-json
导入所需的常数)
import { parse , STR , OBJ } from "partial-json" ;
result = parse ( '{"key": "v' , STR | OBJ ) ;
console . log ( result ) ; // Outputs: { key: 'v' }
在此示例中, Allow.STR
告诉解析器,如果字符串不完整, Allow.OBJ
可以。然后,解析器尝试返回尽可能多的数据。
如果您不允许部分字符串,那么它不会在对象中添加"key"
,因为"v
不近:
result = parse ( '{"key": "v' , OBJ ) ;
console . log ( result ) ; // Outputs: {}
result = parse ( '{"key": "value"' , OBJ ) ;
console . log ( result ) ; // Outputs: { key: 'value' }
相似性,如果允许,则可以分析部分阵列甚至部分特殊值:
(请注意, allow
默认Allow.ALL
。
result = parse ( '[ {"key1": "value1", "key2": [ "value2' ) ;
console . log ( result ) ; // Outputs: [ { key1: 'value1', key2: [ 'value2' ] } ]
result = parse ( "-Inf" ) ;
console . log ( result ) ; // Outputs: -Infinity
如果JSON字符串畸形, parse
功能将丢弃错误:
parse ( "wrong" ) ; // MalformedJSON [Error]: SyntaxError: Unexpected token 'w', "wrong" is not valid JSON at position 0
jsonString
<string>
:解析的JSON字符串。allowPartial
<number>
:指定在JSON解析过程中允许哪种偏差(默认: Allow.ALL
)。返回解析的JavaScript值。
一个指定在JSON解析过程中允许哪种偏见的对象。它具有以下属性:
STR
:允许部分字符串。NUM
:允许部分号码。ARR
:允许部分数组。OBJ
:允许部分对象。NULL
:允许部分空。BOOL
:允许部分布尔值。NAN
:允许部分nan。INFINITY
:允许部分无限。_INFINITY
:允许部分 - infinity。INF
:同时允许部分无限和 - 内度。SPECIAL
:允许所有特殊值。ATOM
:允许所有原子值。COLLECTION
:允许所有收集值。ALL
:允许所有值。 要运行此库的测试,您应该克隆存储库并安装依赖项:
git clone https://github.com/promplate/partial-json-parser-js.git
cd partial-json-parser-js
npm i
然后,您可以使用Vitest进行测试:
npm run test
请注意,虽然我们努力涵盖尽可能多的边缘案例,但总是有可能不涵盖某些情况。
该项目已根据MIT许可获得许可。