Campos ausentes e campos nulos são duas falhas diferentes.
"Campo não encontrado" e "Campo com valor nulo" podem aparecer em branco na interface, mas não devem ser confundidos após entrar no programa. Depois preencha as lacunas com o número zero, e o problema será mais sutil: o downstream recebe um valor legal, mas pensa que vem do texto original.
Se o campo não for encontrado ou tiver valor nulo, ele poderá exibir apenas um espaço em branco na interface, mas o significado é completamente diferente após entrar no programa. Se o espaço em branco for preenchido com o número zero, o downstream receberá um valor legal, mas erroneamente pensa que vem do texto original, tornando o problema mais difícil de encontrar.
Este artigo é direcionado a desenvolvedores e documentadores que precisam entregar os resultados da extração a programas para processamento. Ele explica como usar o esquema JSON para distinguir três estados e usar vários exemplos de entrada para fazer verificações de regressão. Depois de ler isto, você pode definir os limites para valores ausentes, nulos e zero para seu próprio protocolo de dados.
As amostras neste artigo são dados sintéticos e o código foi verificado pela amostra em um ambiente isolado, mas isso não representa uma garantia de todos os arquivos reais ou efeitos do produto. Antes de processar documentos importantes, guarde os originais e revise-os de acordo com os limites e itens de aceitação do texto.
Conclusão de uma frase
O campo está faltando, o valor é null e o valor é 0. Deve haver três estados diferentes. O contrato deve utilizar a existência da chave e do tipo de valor para separá-los. Ele não pode confiar na interface ou em suposições posteriores.
| sua situação | Práticas recomendadas | razão |
|---|---|---|
| Precisa confirmar se a estrutura de saída está completa | Verifique se a chave existe com required | Chaves ausentes indicam que a estrutura de saída está incompleta e não é igual a zero. |
| Nenhum valor disponível no artigo original | Definir valor como null | null significa que nenhum valor disponível foi obtido e não deve ser preenchido com 0 |
| O texto original dá explicitamente zero | Usar valor 0 | Zero é um valor inequívoco, diferentemente dos valores ausentes e nulos |
| Precisa explicar o motivo da não extração | Adicione um campo status ou reason adicional e defina os valores permitidos | Evite soletrar o motivo na sequência de valores para reduzir a desmontagem posterior |
Primeiro separe os três estados
No contrato de composição deste artigo deverá estar presente amount, sendo permitidos valores numéricos ou null. Os significados dos três estados são os seguintes:
- Sem chave
amount: a estrutura de saída está incompleta e é uma exceção de contrato. amountparanull: a chave existe, mas nenhum valor está disponível no momento.amounté 0: existe um valor zero inequívoco.
Outros protocolos podem ser usados para negócios reais, mas devem ser claramente escritos e não podem ser deixados para cada chamador adivinhar.
required do esquema JSON é responsável por verificar se a chave existe e type é responsável por verificar o tipo do valor. Dois equívocos comuns requerem atenção especial:
- Apenas escrever
requirednão desativa automaticamentenull. - Somente o campo está definido em
properties, e não é obrigatório aparecer.
Ambos os pontos são adequados para serem gravados diretamente em testes de regressão. Para a definição completa de objetos e required, consulte Objetos do esquema JSON e obrigatórios.
Verifique o contrato com quatro entradas
from jsonschema import Draft202012Validator
schema = {"type": "object", "required": ["amount"],
"properties": {"amount": {"type": ["number", "null"]}},
"additionalProperties": False}
validator = Draft202012Validator(schema)
valid = lambda value: not list(validator.iter_errors(value))
assert valid({"amount": None})
assert valid({"amount": 0})
assert not valid({})
assert not valid({"amount": "unknown"})
assert not valid({"amount": None, "guessed": True})
jsonschema precisa ser instalado antes de ser executado. Este código apenas faz uma verificação de estrutura na memória, não chama o modelo de extração e não pode provar que uma determinada quantidade é consistente com o texto original.
Se o valor exigir representação decimal precisa, o protocolo de cadeia decimal poderá ser usado. Não pense nos cálculos de ponto flutuante binário apenas como uma solução financeira só porque o exemplo usa number.
A interface também deve indicar o status claramente.
A exibição na interface também precisa distinguir entre estados, caso contrário, os usuários interpretarão mal significados diferentes como o mesmo resultado.
| dados | O estado que deve ser expresso | não deve ser exibido como |
|---|---|---|
| Nenhuma chave de valor | Exceção de contrato de saída | O valor é zero |
| o valor é nulo | Nenhum valor disponível foi obtido | Extração bem-sucedida |
| o valor é 0 | tem um valor zero claro | Ausente |
| quantidade é uma string desconhecida | Não está em conformidade com este contrato | Convertido automaticamente para nulo e passado silenciosamente |
Não insira motivos faltantes em campos numéricos
Se precisar distinguir entre "texto original não fornecido", "imagem ilegível", "conflito de candidato" etc., você pode adicionar um campo status ou reason adicional e definir valores permitidos para ele.
Não escreva o motivo em uma sequência de valores e depois peça ao downstream que extraia os números dela. Desconhecido não é o mesmo que falha: alguns documentos não possuem este campo, e o resultado correto é deixá-lo desconhecido.
📊 Comparação principal
| estado | A chave existe? | valor | significado |
|---|---|---|---|
| Ausente | não | nenhum | A estrutura de saída está incompleta |
| valor nulo | sim | null | No momento não há valores disponíveis |
| valor zero | sim | 0 | valor explícito zero |
🎯 Qual método é adequado para você?
Se você precisar verificar se a saída da interface está completa
Use required para verificar se a chave existe. Uma chave ausente é considerada diretamente uma exceção de contrato.
Se o seu documento muitas vezes não possui um determinado campo
Permita que o valor deste campo seja null e especifique o motivo com status ou reason.
Se o valor precisar ser calculado com precisão
Considere o protocolo de string decimal e não confie diretamente em números flutuantes binários.
Se você quiser fazer tradução ou verificação após a extração
Verifique em conjunto a moeda, a proveniência e as etiquetas correspondentes para confirmar que os números-chave não foram alterados por engano.
❓ Perguntas frequentes (FAQ)
1. Se você escrever apenas como obrigatório, isso significa que nulo é proibido?
não. required apenas verifica se a chave existe, a desativação de null precisa ser definida separadamente em type.
2. Qual é a diferença entre um campo ser nulo e um campo ser 0?
null significa que atualmente não há valor disponível, 0 é um valor inequívoco. Ambos devem ser representados no contrato e na interface, respectivamente.
3. JSON legal significa que o resultado da extração é preciso?
Não significa. A fiscalização estrutural só pode confirmar se o formato é consistente com o contrato, mas não pode provar que o valor é consistente com o texto original.
4. O campo pode ser exibido diretamente como 0 quando estiver faltando?
Não recomendado. Ausente significa que a estrutura de saída está incompleta. Preencher 0 fará com que o downstream o trate como o valor real.
📝 Resumo
Valores ausentes, nulos e zero têm significados próprios e devem ser expressos separadamente por meio de contratos e interfaces. Após a aprovação da estrutura, ainda será necessário verificar a moeda, a origem e a etiqueta correspondente do valor.
Experimente agora: carregue o documento para iniciar a tradução, mantendo o layout original


