Às vezes, precisamos de LLM (grandes modelos de linguagem) para produzir informações estruturais em vez de linguagem natural. A maneira mais fácil é usar o JSON.
Mas antes de receber o último sinal de resposta, o JSON está quebrado, o que significa que você não pode usar JSON.parse para decodificá -lo. Mas ainda queremos transmitir os dados para o usuário.
Aí vem partial-json-parser , uma biblioteca leve e personalizável para analisar as cordas JSON parciais. Aqui está uma demonstração.
(Observe que também existe uma implementação de JavaScript)
pip install partial-json-parser # or poetry / pdm / uv partial-json-parser é implementado puramente em Python, com boas dicas de tipo. É dependência zero e trabalha com o Python 3.6+.
Você pode instalar o Run seu playground de demonstração, instalando rich também ou:
pip install partial-json-parser[playground] Em seguida, execute o json-playground no seu terminal e você pode experimentar o analisador interativamente.
from partial_json_parser import loads
> >> loads ( '{"key": "v' ) # {'key': 'v'} Como alternativa, você pode usar ensure_json para obter a string json concluída:
from partial_json_parser import ensure_json
> >> ensure_json ( '{"key": "v' ) # '{"key": "v"}' Você pode importar a função loads e o objeto Allow da biblioteca como este:
from partial_json_parser import loads , Allow O objeto Allow é apenas uma enumeração de opções. Determina quais tipos podem ser parciais. Os tipos não incluídos no allow apenas aparecem após a conclusão da sua conclusão.
A função loads funciona como o json.loads carregado embutido ao analisar uma string JSON completa:
result = loads ( '{"key":"value"}' )
print ( result ) # Outputs: {'key': 'value'} Você pode analisar uma string JSON parcial passando um parâmetro adicional para a função loads . Este parâmetro é um bit netwise ou das constantes do sinalizador Allow :
(Observe que você pode importar diretamente as constantes que você precisa de partial-json-parser )
from partial_json_parser import loads , Allow , STR , OBJ
result = loads ( '{"key": "v' , STR | OBJ )
print ( result ) # Outputs: {'key': 'v'} Neste exemplo, Allow.STR diz ao analisador que está tudo bem se uma string estiver incompleta e Allow.OBJ . O analisador tenta retornar o máximo de dados possível.
Se você não permitir seqüências parciais, ela não adicionará "key" ao objeto porque "v não está perto:
result = loads ( '{"key": "v' , OBJ )
print ( result ) # Outputs: {}
result = loads ( '{"key": "value"' , OBJ )
print ( result ) # Outputs: {'key': 'value'}Similaridade, você pode analisar listas parciais ou até valores especiais parciais se permitir:
(Observe que allow que os padrões Allow.ALL )
result = loads ( '[ {"key1": "value1", "key2": [ "value2' )
print ( result ) # Outputs: [{'key1': 'value1', 'key2': ['value2']}]
result = loads ( "-Inf" )
print ( result ) # Outputs: -inf Se a string json estiver malformada, a função parse lançará um erro:
loads ( "wrong" ) # MalformedJSON: Malformed node or string on line 1 json_string <string> : a string json (incompleta) para analisar.allow_partial <Allow | int> : Especifique que tipo de parcialidade é permitida durante o JSON Parsing (padrão: Allow.ALL ).parser (str) -> JSON : Um analisador JSON comum. O padrão é json.loads . Preencha a corda JSON e analise -a com a função parser .
Retorna o valor de Python analisado.
Alias: decode , parse_json .
json_string <string> : a string json (incompleta) a ser concluída.allow_partial <Allow | int> : Especifique que tipo de parcialidade é permitida durante o JSON Parsing (padrão: Allow.ALL ).Retorna a sequência JSON concluída.
json_string <string> : a string json (incompleta) a ser concluída.allow_partial <Allow | int> : Especifique que tipo de parcialidade é permitida durante o JSON Parsing (padrão: Allow.ALL ).Retorna uma tupla de uma fatia da sequência de entrada e a conclusão.
Observe que esta é uma API de baixo nível, apenas útil para depuração e demonstração.
A classe Enum que especifica que tipo de parcialidade é permitida durante a análise JSON. Tem os seguintes membros:
STR : Permitir uma corda parcial.NUM : permita o número parcial.ARR : Permitir uma matriz parcial.OBJ : Permitir objeto parcial.NULL : Deixe nulo parcial.BOOL : Permita booleano parcial.NAN : Permitir Nan parcial.INFINITY : permita o infinito parcial._INFINITY : permita parcial -infinity.INF : Permitir infinidade parcial e -infinity.SPECIAL : permita todos os valores especiais.ATOM : Permita todos os valores atômicos.COLLECTION : permita todos os valores de coleta.ALL : permita todos os valores. Para executar os testes para esta biblioteca, você deve clonar o repositório e instalar as dependências:
git clone https://github.com/promplate/partial-json-parser.git
cd partial-json-parser
pdm installEm seguida, você pode executar os testes usando hipótese e pytest:
pdm testObserve que, embora nos esforcemos para cobrir o maior número possível de casos de borda, é sempre possível que alguns casos não sejam cobertos.
Este projeto está licenciado sob a licença do MIT.