1
resposta

Minha solução

public static Unit DesSerializedUnit(string Json)
{
    string corrigido = Encoding.UTF8.GetString(
        Encoding.GetEncoding("ISO-8859-1").GetBytes(Json));
    return JsonConvert.DeserializeObject<Unit>(corrigido);
}
private void Txt_CEP_Leave(object sender, EventArgs e)
{
    string vCep = Txt_CEP.Text;

    if (string.IsNullOrEmpty(vCep)) return;
    if (vCep.Length != 8)
    {
        LimpaDadosEndereco(true);
        return;
    }
    if (!Information.IsNumeric(vCep))
    {
        LimpaDadosEndereco(true);
        return;
    }

    var vJson = Cls_Uteis.GeraJSONCEP(vCep);

    //Cep.Unit CEP = new Cep.Unit();
    Cep.Unit CEP = Cep.DesSerializedUnit(vJson);

    if (string.IsNullOrEmpty(CEP.estado))
    {
        MessageBox.Show("O número do CEP informado não foi localizado!","CEP ",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
        LimpaDadosEndereco(false);
        return;
    }

    Txt_Logradouro.Text = CEP.logradouro;
    Txt_Bairro.Text = CEP.bairro;
    Txt_Cidade.Text = CEP.localidade;
    Cmb_Estados.SelectedIndex = -1;
    
    for (int i = 0; i <= Cmb_Estados.Items.Count - 1; i++)
    {
        var item = Cmb_Estados.Items[i].ToString();
            
        if (!item.Contains(CEP.estado)) continue;
         
        Cmb_Estados.SelectedIndex = i;
    }
    
}

private void LimpaDadosEndereco(bool cepInvalido)
{
    if (cepInvalido) 
        MessageBox.Show("CEP inválido! Digite apenas os 8 números do CEP!","CEP INVÁLIDO", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

    Txt_CEP.Text = string.Empty;
    Txt_Logradouro.Text = string.Empty;
    Txt_Bairro.Text = string.Empty;
    Txt_Cidade.Text = string.Empty;
    Cmb_Estados.SelectedIndex = -1;
    Txt_CEP.Select();
}
1 resposta

Oi, Robson! Como vai?

Gostei da forma como você organizou as validações do CEP antes de consumir o JSON e também da separação da lógica no método LimpaDadosEndereco. Isso deixa o código mais claro e facilita a manutenção. O uso do DeserializeObject<Unit> também mostra que você entendeu bem a relação entre classes e JSON.

Uma dica interessante para o futuro é utilizar int.TryParse no lugar de Information.IsNumeric, deixando a validação mais alinhada ao C#. Veja este exemplo:


string cep = Txt_CEP.Text;
int numeroCep;

if(!int.TryParse(cep, out numeroCep))
{
    MessageBox.Show("CEP invalido");
}

O método TryParse tenta converter a string para número e retorna true ou false, evitando exceções e deixando o código mais seguro.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!