{"id":12917,"date":"2022-03-22T08:54:20","date_gmt":"2022-03-22T15:54:20","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=12917"},"modified":"2025-06-13T21:25:03","modified_gmt":"2025-06-14T04:25:03","slug":"validate-json-documents-in-python-using-pydantic","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/validate-json-documents-in-python-using-pydantic\/","title":{"rendered":"Valida\u00e7\u00e3o de documentos JSON em Python usando Pydantic"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Uma das principais atra\u00e7\u00f5es do <\/span><b>bancos de dados de documentos<\/b><span style=\"font-weight: 400\"> \u00e9 a flexibilidade da estrutura ou do esquema do documento. Na maioria das vezes, a flexibilidade do esquema do documento \u00e9 ben\u00e9fica. No entanto, pode haver algumas situa\u00e7\u00f5es em que ter alguma estrutura para o documento pode ser \u00fatil. Este artigo mostra como validar seus documentos JSON em rela\u00e7\u00e3o a um esquema especificado usando a popular biblioteca Python <\/span><a href=\"https:\/\/pydantic-docs.helpmanual.io\/\"><span style=\"font-weight: 400\">pydantic<\/span><\/a><span style=\"font-weight: 400\">.<\/span><\/p>\n<h4><span style=\"font-weight: 400\">Quando voc\u00ea precisa validar documentos?<\/span><\/h4>\n<p><span style=\"font-weight: 400\">Uma concep\u00e7\u00e3o err\u00f4nea comum sobre o uso de bancos de dados NoSQL \u00e9 que n\u00e3o s\u00e3o necess\u00e1rias estruturas ou esquemas de documentos. Na maioria dos casos, os aplicativos tendem a ter algumas restri\u00e7\u00f5es para os dados, mesmo que n\u00e3o os validem especificamente. Por exemplo, pode haver alguns campos no documento dos quais o aplicativo depende para sua funcionalidade. Um aplicativo pode simplesmente n\u00e3o funcionar corretamente quando alguns desses campos JSON pid\u00eamicos estiverem faltando.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Um exemplo do mundo real desse problema poderia ser um aplicativo que l\u00ea dados de outro aplicativo n\u00e3o confi\u00e1vel que envia periodicamente dados ruins. Seria prudente destacar todos os documentos que poderiam quebrar o aplicativo nesses casos. Os desenvolvedores podem fazer isso <\/span><i><span style=\"font-weight: 400\">no aplicativo <\/span><\/i><span style=\"font-weight: 400\">ou <\/span><i><span style=\"font-weight: 400\">no n\u00edvel do documento<\/span><\/i><span style=\"font-weight: 400\">.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Nessa abordagem, especificamos um esquema de JSON para pid\u00e2ntica para os documentos, a fim de ajudar a identificar aqueles que n\u00e3o correspondem \u00e0s especifica\u00e7\u00f5es do aplicativo no n\u00edvel do documento.<\/span><\/p>\n<h4><span style=\"font-weight: 400\">Gerar dados de teste JSON<\/span><\/h4>\n<p><span style=\"font-weight: 400\">Usamos a biblioteca de c\u00f3digo aberto, <\/span><a href=\"https:\/\/faker.readthedocs.io\/en\/master\/#\"><span style=\"font-weight: 400\">Faker<\/span><\/a><span style=\"font-weight: 400\">para gerar alguns perfis de usu\u00e1rio falsos para este tutorial.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Essa \u00e9 a estrutura de um \u00fanico documento:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"job\": \"Radiographer, diagnostic\",\r\n  \"company\": \"Klein, Dillon and Neal\",\r\n  \"residence\": \"2232 Jackson Forks\\nLake Teresa, CO 46959\",\r\n  \"website\": [\r\n    \"https:\/\/bishop-torres.net\/\"\r\n  ],\r\n  \"username\": \"aabbott\",\r\n  \"name\": \"Madison Mitchell\",\r\n  \"address\": \"1782 Moore Hill Apt. 717\\nWest Stephaniestad, NM 75293\",\r\n  \"mail\": \"amberrodriguez@hotmail.com\",\r\n  \"phone\": {\r\n    \"home\": \"677-197-4239x889\",\r\n    \"mobile\": \"001-594-038-9255x99138\"\r\n  }\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">Para simular os documentos quebrados, modifico uma pequena parte dos perfis de usu\u00e1rio, excluindo alguns dos campos de telefone celular e e-mail. Nosso objetivo \u00e9 identificar esses registros que, no mundo real, seriam armazenados em um banco de dados de documentos como o Couchbase.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Carrego os dados pid\u00e2nticos gerados a partir do JSON em um bucket em nosso servidor hospedado <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/capella\/\"><span style=\"font-weight: 400\">Couchbase Capella<\/span><\/a><span style=\"font-weight: 400\"> cluster usando o <\/span><i><span style=\"font-weight: 400\">importa\u00e7\u00e3o <\/span><\/i><span style=\"font-weight: 400\">na interface integrada do console da Web para nossos testes. Eu especifico o <\/span><i><span style=\"font-weight: 400\">nome de usu\u00e1rio <\/span><\/i><span style=\"font-weight: 400\">como a chave para identificar exclusivamente cada documento.<\/span><\/p>\n<h4><span style=\"font-weight: 400\">Como especificar um esquema para documentos JSON?<\/span><\/h4>\n<p><span style=\"font-weight: 400\">Nos dados do perfil do usu\u00e1rio, espero que os documentos estejam em conformidade com a seguinte estrutura em meus aplicativos:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Campos obrigat\u00f3rios:<\/span>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">nome de usu\u00e1rio<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">nome<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">phone - com elementos JSON para \"home\" e \"mobile\"<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">correio<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">website - uma matriz<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Campos opcionais:<\/span>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">empresa<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">resid\u00eancia<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">trabalho<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">endere\u00e7o<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">Pydantic \u00e9 uma das bibliotecas mais populares em Python para valida\u00e7\u00e3o de dados. A sintaxe para especificar o esquema \u00e9 semelhante ao uso de <\/span><a href=\"https:\/\/docs.python.org\/3\/library\/typing.html\"><span style=\"font-weight: 400\">dicas de tipos para fun\u00e7\u00f5es em Python<\/span><\/a><span style=\"font-weight: 400\">. Os desenvolvedores podem especificar o esquema definindo um modelo. O Pydantic tem um rico conjunto de recursos para fazer uma variedade de valida\u00e7\u00f5es de JSON. Examinaremos a representa\u00e7\u00e3o de algumas especifica\u00e7\u00f5es de documentos de perfil de usu\u00e1rio.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Uma observa\u00e7\u00e3o sobre o pydantic \u00e9 que, por padr\u00e3o, ele tenta coagir os tipos de dados fazendo convers\u00f5es de tipo quando poss\u00edvel - por exemplo, convertendo a string '1' em um 1 num\u00e9rico. No entanto, h\u00e1 uma op\u00e7\u00e3o para <\/span><a href=\"https:\/\/pydantic-docs.helpmanual.io\/usage\/types\/#strict-types\"><span style=\"font-weight: 400\">ativar a verifica\u00e7\u00e3o rigorosa de tipos<\/span><\/a><span style=\"font-weight: 400\"> sem realizar convers\u00f5es.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Neste exemplo de c\u00f3digo, voc\u00ea v\u00ea uma configura\u00e7\u00e3o b\u00e1sica para o esquema UserProfile usando a sintaxe pydantic:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:python decode:true\">class UserProfile(BaseModel):\r\n\u00a0\u00a0\u00a0\"\"\"Schema for User Profiles\"\"\"\r\n\u00a0\u00a0\u00a0username: str\r\n\u00a0\u00a0\u00a0name: str\r\n\u00a0\u00a0\u00a0phone: Phone\r\n\u00a0\u00a0\u00a0mail: str\r\n\u00a0\u00a0\u00a0company: Optional[str]\r\n\u00a0\u00a0\u00a0residence: Optional[str]\r\n\u00a0\u00a0\u00a0website: List[HttpUrl]\r\n\u00a0\u00a0\u00a0job: Optional[str]\r\n\u00a0\u00a0\u00a0address: Optional[str]<\/pre>\n<p><span style=\"font-weight: 400\">Cada campo \u00e9 especificado junto com o tipo de dados esperado. Os campos opcionais s\u00e3o marcados como <\/span><i><span style=\"font-weight: 400\">Opcional<\/span><\/i><span style=\"font-weight: 400\">. Uma matriz \u00e9 especificada pelo par\u00e2metro <\/span><i><span style=\"font-weight: 400\">Lista <\/span><\/i><span style=\"font-weight: 400\">seguida pelo tipo de dados desejado.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O <\/span><i><span style=\"font-weight: 400\">nome de usu\u00e1rio <\/span><\/i><span style=\"font-weight: 400\">precisa ser uma string, enquanto o campo <\/span><i><span style=\"font-weight: 400\">empresa <\/span><\/i><span style=\"font-weight: 400\">\u00e9 uma cadeia de caracteres opcional. Se observarmos as outras linhas do snippet, veremos que o <\/span><i><span style=\"font-weight: 400\">site <\/span><\/i><span style=\"font-weight: 400\">\u00e9 uma lista do tipo <\/span><i><span style=\"font-weight: 400\">HttpUrl - <\/span><\/i><span style=\"font-weight: 400\">um dos muitos tipos personalizados fornecidos pelo pydantic imediatamente. <\/span><i><span style=\"font-weight: 400\">HttpUrl <\/span><\/i><span style=\"font-weight: 400\">\u00e9 usado para validar se o URL \u00e9 v\u00e1lido e n\u00e3o cadeias de caracteres aleat\u00f3rias. Da mesma forma, h\u00e1 outros campos como <\/span><i><span style=\"font-weight: 400\">e-mails <\/span><\/i><span style=\"font-weight: 400\">que poder\u00edamos usar para garantir que os campos de e-mail sejam um formul\u00e1rio v\u00e1lido.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Se voc\u00ea observar o <\/span><i><span style=\"font-weight: 400\">telefone <\/span><\/i><span style=\"font-weight: 400\">ele \u00e9 marcado como um campo <\/span><i><span style=\"font-weight: 400\">Telefone <\/span><\/i><span style=\"font-weight: 400\">que \u00e9 um tipo personalizado que definiremos no pr\u00f3ximo trecho de c\u00f3digo:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:python decode:true\">class Phone(BaseModel):\r\n   \"\"\"Schema for Phone numbers\"\"\"\r\n   home: str\r\n   mobile: str\r\n\r\n   @validator(\"mobile\", \"home\")\r\n   def does_not_contain_extension(cls, v):\r\n       \"\"\"Check if the phone numbers contain extensions\"\"\"\r\n       if \"x\" in v:\r\n         raise ExtensionError(wrong_value=v)\r\n       return v<\/pre>\n<p><span style=\"font-weight: 400\">Aqui especificamos que o <\/span><i><span style=\"font-weight: 400\">Telefone <\/span><\/i><span style=\"font-weight: 400\">\u00e9 composto de dois campos que s\u00e3o cadeias de caracteres: <\/span><i><span style=\"font-weight: 400\">casa <\/span><\/i><span style=\"font-weight: 400\">e <\/span><i><span style=\"font-weight: 400\">m\u00f3vel<\/span><\/i><span style=\"font-weight: 400\">. Isso seria verificado dentro do <\/span><i><span style=\"font-weight: 400\">Perfil do usu\u00e1rio <\/span><\/i><span style=\"font-weight: 400\">e interpretado como o modelo <\/span><i><span style=\"font-weight: 400\">Perfil do usu\u00e1rio <\/span><\/i><span style=\"font-weight: 400\">contendo um modelo <\/span><i><span style=\"font-weight: 400\">telefone <\/span><\/i><span style=\"font-weight: 400\">que cont\u00e9m o campo <\/span><i><span style=\"font-weight: 400\">casa <\/span><\/i><span style=\"font-weight: 400\">e <\/span><i><span style=\"font-weight: 400\">m\u00f3vel <\/span><\/i><span style=\"font-weight: 400\">campos.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">O Pydantic tamb\u00e9m nos permite validar o <\/span><i><span style=\"font-weight: 400\">conte\u00fado <\/span><\/i><span style=\"font-weight: 400\">dos dados e o tipo e a presen\u00e7a dos dados. Voc\u00ea pode fazer isso definindo fun\u00e7\u00f5es que validam campos espec\u00edficos. No exemplo acima, validamos o campo <\/span><i><span style=\"font-weight: 400\">m\u00f3vel <\/span><\/i><span style=\"font-weight: 400\">e <\/span><i><span style=\"font-weight: 400\">casa <\/span><\/i><span style=\"font-weight: 400\">para verificar se h\u00e1 extens\u00f5es. Se eles contiverem uma extens\u00e3o, n\u00e3o a suportaremos e lan\u00e7aremos um erro personalizado. Esses erros de esquema s\u00e3o ent\u00e3o mostrados aos usu\u00e1rios que fazem a valida\u00e7\u00e3o pid\u00e2ntica.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Voc\u00ea pode visualizar a defini\u00e7\u00e3o do esquema especificando o par\u00e2metro <\/span><i><span style=\"font-weight: 400\">Model.schema_json()<\/span><\/i><span style=\"font-weight: 400\"> como mostrado aqui:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"title\": \"UserProfile\",\r\n  \"description\": \"Schema for User Profiles\",\r\n  \"type\": \"object\",\r\n  \"properties\": {\r\n    \"username\": {\r\n      \"title\": \"Username\",\r\n      \"type\": \"string\"\r\n    },\r\n    \"name\": {\r\n      \"title\": \"Name\",\r\n      \"type\": \"string\"\r\n    },\r\n    \"phone\": {\r\n      \"$ref\": \"#\/definitions\/Phone\"\r\n    },\r\n    \"mail\": {\r\n      \"title\": \"Mail\",\r\n      \"type\": \"string\"\r\n    },\r\n    \"company\": {\r\n      \"title\": \"Company\",\r\n      \"type\": \"string\"\r\n    },\r\n    \"residence\": {\r\n      \"title\": \"Residence\",\r\n      \"type\": \"string\"\r\n    },\r\n    \"website\": {\r\n      \"title\": \"Website\",\r\n      \"type\": \"array\",\r\n      \"items\": {\r\n        \"type\": \"string\",\r\n        \"minLength\": 1,\r\n        \"maxLength\": 2083,\r\n        \"format\": \"uri\"\r\n      }\r\n    },\r\n    \"job\": {\r\n      \"title\": \"Job\",\r\n      \"type\": \"string\"\r\n    },\r\n    \"address\": {\r\n      \"title\": \"Address\",\r\n      \"type\": \"string\"\r\n    }\r\n  },\r\n  \"required\": [\r\n    \"username\",\r\n    \"name\",\r\n    \"phone\",\r\n    \"mail\",\r\n    \"website\"\r\n  ],\r\n  \"definitions\": {\r\n    \"Phone\": {\r\n      \"title\": \"Phone\",\r\n      \"description\": \"Schema for Phone numbers\",\r\n      \"type\": \"object\",\r\n      \"properties\": {\r\n        \"home\": {\r\n          \"title\": \"Home\",\r\n          \"type\": \"string\"\r\n        },\r\n        \"mobile\": {\r\n          \"title\": \"Mobile\",\r\n          \"type\": \"string\"\r\n        }\r\n      },\r\n      \"required\": [\r\n        \"home\",\r\n        \"mobile\"\r\n      ]\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<h4><span style=\"color: #343e47;font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size: 50px\">Valida\u00e7\u00e3o de documentos JSON em rela\u00e7\u00e3o a um esquema Python pid\u00e2ntico<\/span><\/h4>\n<p><span style=\"font-weight: 400\">Agora que definimos o esquema, vamos explorar como podemos validar os documentos em rela\u00e7\u00e3o ao esquema.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A valida\u00e7\u00e3o pode ser feita usando o pydantic <\/span><i><span style=\"font-weight: 400\">parse_obj<\/span><\/i><span style=\"font-weight: 400\"> do modelo. Voc\u00ea especifica o documento como um dicion\u00e1rio e verifica se h\u00e1 exce\u00e7\u00f5es de valida\u00e7\u00e3o. Nesse caso, buscamos todos os documentos (at\u00e9 o limite especificado) usando uma consulta do Couchbase, testamos um a um e informamos os erros.<\/span><\/p>\n<pre class=\"decode-attributes:false lang:python decode:true\">password_authenticator = PasswordAuthenticator(DB_USER, DB_PWD)\r\n    cluster = Cluster(\r\n       CONN_STR,\r\n       ClusterOptions(password_authenticator),\r\n    )\r\n   validation_error_count = 0\r\n   query = f\"select profile.* from `{BUCKET}`.{SCOPE}.{COLLECTION} profile LIMIT {DOCUMENT_LIMIT}\"\r\n   try:\r\n      results = cluster.query(query)\r\n      for row in results:\r\n         try:\r\n            UserProfile.parse_obj(row)\r\n            validation_error_count += 1\r\n         except ValidationError as e:\r\n               print(f\"Error found in document: {row['username']}\\n\", e.json())\r\n   except Exception as e:\r\n       print(e)\r\n\r\n   print(f\"Validation Error Count: {validation_error_count}\")<\/pre>\n<p><span style=\"font-weight: 400\">O esquema destaca alguns dos erros observados nos documentos:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">Error found in document: aarias\r\n\u00a0[\r\n\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\"loc\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"phone\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"home\"\r\n\u00a0\u00a0\u00a0\u00a0],\r\n\u00a0\u00a0\u00a0\u00a0\"msg\": \"value is an extension, got \\\"(932)532-4001x319\\\"\",\r\n\u00a0\u00a0\u00a0\u00a0\"type\": \"value_error.extension\",\r\n\u00a0\u00a0\u00a0\u00a0\"ctx\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"wrong_value\": \"(932)532-4001x319\"\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0},\r\n\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\"loc\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"phone\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"mobile\"\r\n\u00a0\u00a0\u00a0\u00a0],\r\n\u00a0\u00a0\u00a0\u00a0\"msg\": \"field required\",\r\n\u00a0\u00a0\u00a0\u00a0\"type\": \"value_error.missing\"\r\n\u00a0\u00a0}\r\n]<\/pre>\n<p><span style=\"font-weight: 400\">O documento com a ID <\/span><i><span style=\"font-weight: 400\">aarias<\/span><\/i><span style=\"font-weight: 400\"> tem extens\u00f5es no campo dom\u00e9stico, e o <\/span><i><span style=\"font-weight: 400\">telefone <\/span><\/i><span style=\"font-weight: 400\">\u2192 <\/span><i><span style=\"font-weight: 400\">m\u00f3vel <\/span><\/i><span style=\"font-weight: 400\">tamb\u00e9m est\u00e1 faltando.<\/span><\/p>\n<h4><span style=\"font-weight: 400\">Resumo<\/span><\/h4>\n<p><span style=\"font-weight: 400\">Este exemplo de perfil de usu\u00e1rio mostra como podemos criar facilmente esquemas personalizados para nossos documentos JSON. Esta postagem tamb\u00e9m mostra como usar os recursos de teste e valida\u00e7\u00e3o do Python e do m\u00f3dulo pydantic. No entanto, \u00e9 apenas a ponta do iceberg - h\u00e1 muito mais <\/span><a href=\"https:\/\/pydantic-docs.helpmanual.io\/usage\/types\/\"><span style=\"font-weight: 400\">tipos<\/span><\/a><span style=\"font-weight: 400\"> que podemos validar.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Outras abordagens tamb\u00e9m s\u00e3o poss\u00edveis; por exemplo, voc\u00ea pode validar os dados no momento da grava\u00e7\u00e3o. Isso pode ser feito com bastante facilidade integrando o esquema que definimos aqui ao aplicativo e verificando os dados antes de inseri-los\/uprimi-los no Couchbase.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O c\u00f3digo completo dessa demonstra\u00e7\u00e3o pode ser encontrado em <\/span><a href=\"https:\/\/github.com\/nithishr\/json-schema-validation\"><span style=\"font-weight: 400\">Github<\/span><\/a><span style=\"font-weight: 400\">. As instru\u00e7\u00f5es para gerar os dados e executar os scripts tamb\u00e9m podem ser encontradas l\u00e1.<\/span><\/p>\n<h4>Recursos<\/h4>\n<ul>\n<li><a href=\"https:\/\/github.com\/nithishr\/json-schema-validation\">Valida\u00e7\u00e3o do esquema JSON<\/a> - Reposit\u00f3rio do GitHub para o c\u00f3digo desta publica\u00e7\u00e3o<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/capella\/\"><span style=\"font-weight: 400\">Couchbase Capella<\/span><\/a> &#8211; <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/capella\/\">DBaaS NoSQL totalmente hospedado<\/a><\/li>\n<li><a href=\"https:\/\/pydantic-docs.helpmanual.io\/\">M\u00f3dulo Python pydantic<\/a><\/li>\n<li><a href=\"https:\/\/faker.readthedocs.io\/en\/master\/#\">M\u00f3dulo Python Faker<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>One of the main attractions of document databases is the flexibility of the document structure or schema. For the most part, the flexibility in the document schema is beneficial. However, there might be some situations where having some structure to [&hellip;]<\/p>","protected":false},"author":80878,"featured_media":10763,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1819,9139],"tags":[1261,1488],"ppma_author":[9544],"class_list":["post-12917","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-data-modeling","category-python","tag-json","tag-schema"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JSON Validation Against Pydantic Schema Tutorial | Couchbase<\/title>\n<meta name=\"description\" content=\"Find out how to validate JSON documents against a specified schema using the popular Python library pydantic. Get validation best practices at Couchbase.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/validate-json-documents-in-python-using-pydantic\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Validate JSON Documents in Python using Pydantic\" \/>\n<meta property=\"og:description\" content=\"Find out how to validate JSON documents against a specified schema using the popular Python library pydantic. Get validation best practices at Couchbase.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/validate-json-documents-in-python-using-pydantic\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-22T15:54:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:25:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Nithish Raghunandanan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nithish Raghunandanan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/\"},\"author\":{\"name\":\"nithishr\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c5a843d75ad78b5b698f59ca6d123af2\"},\"headline\":\"Validate JSON Documents in Python using Pydantic\",\"datePublished\":\"2022-03-22T15:54:20+00:00\",\"dateModified\":\"2025-06-14T04:25:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/\"},\"wordCount\":1046,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg\",\"keywords\":[\"JSON\",\"Schema\"],\"articleSection\":[\"Couchbase Server\",\"Data Modeling\",\"Python\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/\",\"name\":\"JSON Validation Against Pydantic Schema Tutorial | Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg\",\"datePublished\":\"2022-03-22T15:54:20+00:00\",\"dateModified\":\"2025-06-14T04:25:03+00:00\",\"description\":\"Find out how to validate JSON documents against a specified schema using the popular Python library pydantic. Get validation best practices at Couchbase.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg\",\"width\":1200,\"height\":800,\"caption\":\"\\\"binary damage code\\\" by Markus Spiske, Public Domain Image\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Validate JSON Documents in Python using Pydantic\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c5a843d75ad78b5b698f59ca6d123af2\",\"name\":\"nithishr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/63270a592008f9080fe48b7652fe559f\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/image-4.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/image-4.png\",\"caption\":\"nithishr\"},\"description\":\"Nithish is an engineer who loves to build products that solve real-world problems in short spans of time. He has experienced different areas of the industry having worked in diverse companies in Germany and India. Apart from work, he likes to travel and interact and engage with the tech community through Meetups &amp; Hackathons. In his free time, he likes to try stuff out by hacking things together.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/nithishr\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JSON Validation Against Pydantic Schema Tutorial | Couchbase","description":"Find out how to validate JSON documents against a specified schema using the popular Python library pydantic. Get validation best practices at Couchbase.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/validate-json-documents-in-python-using-pydantic\/","og_locale":"pt_BR","og_type":"article","og_title":"Validate JSON Documents in Python using Pydantic","og_description":"Find out how to validate JSON documents against a specified schema using the popular Python library pydantic. Get validation best practices at Couchbase.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/validate-json-documents-in-python-using-pydantic\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-03-22T15:54:20+00:00","article_modified_time":"2025-06-14T04:25:03+00:00","og_image":[{"width":1200,"height":800,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg","type":"image\/jpeg"}],"author":"Nithish Raghunandanan","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Nithish Raghunandanan","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/"},"author":{"name":"nithishr","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c5a843d75ad78b5b698f59ca6d123af2"},"headline":"Validate JSON Documents in Python using Pydantic","datePublished":"2022-03-22T15:54:20+00:00","dateModified":"2025-06-14T04:25:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/"},"wordCount":1046,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg","keywords":["JSON","Schema"],"articleSection":["Couchbase Server","Data Modeling","Python"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/","url":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/","name":"JSON Validation Against Pydantic Schema Tutorial | Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg","datePublished":"2022-03-22T15:54:20+00:00","dateModified":"2025-06-14T04:25:03+00:00","description":"Find out how to validate JSON documents against a specified schema using the popular Python library pydantic. Get validation best practices at Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/02\/MFA-BGimage-lg.jpg","width":1200,"height":800,"caption":"\"binary damage code\" by Markus Spiske, Public Domain Image"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/validate-json-documents-in-python-using-pydantic\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Validate JSON Documents in Python using Pydantic"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c5a843d75ad78b5b698f59ca6d123af2","name":"nithishr","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/63270a592008f9080fe48b7652fe559f","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/image-4.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/image-4.png","caption":"nithishr"},"description":"Nithish \u00e9 um engenheiro que adora criar produtos que resolvam problemas do mundo real em um curto espa\u00e7o de tempo. Ele tem experi\u00eancia em diferentes \u00e1reas do setor, tendo trabalhado em diversas empresas na Alemanha e na \u00cdndia. Al\u00e9m do trabalho, ele gosta de viajar, interagir e se envolver com a comunidade de tecnologia por meio de Meetups e Hackathons. Em seu tempo livre, ele gosta de experimentar coisas, criando coisas.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/nithishr\/"}]}},"authors":[{"term_id":9544,"user_id":80878,"is_guest":0,"slug":"nithishr","display_name":"Nithish Raghunandanan","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/image-4.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/03\/image-4.png"},"author_category":"","last_name":"Raghunandanan","first_name":"Nithish","job_title":"","user_url":"","description":"Nithish \u00e9 um engenheiro que adora criar produtos que resolvam problemas do mundo real em um curto espa\u00e7o de tempo. Ele tem experi\u00eancia em diferentes \u00e1reas do setor, tendo trabalhado em diversas empresas na Alemanha e na \u00cdndia. Al\u00e9m do trabalho, ele gosta de viajar, interagir e se envolver com a comunidade de tecnologia por meio de Meetups e Hackathons. Em seu tempo livre, ele gosta de experimentar coisas, criando coisas."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/12917","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/80878"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=12917"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/12917\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10763"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=12917"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=12917"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=12917"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=12917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}