Matheus, observando o exemplo do código Contract.prw, verifiquei que existe um erro no alias utilizado pela query.
Sempre que utilizamos uma query no Protheus, precisamos informar um Alias para a mesma. Esse Alias é a área de trabalho que o sistema irá utilizar para retornar os dados da sua consulta.
Verifiquei que você abriu a query utilizando o alias cAliasCN9.
dbUseArea(.T., "TOPCONN", TcGenQry(,,cQuery), cAliasCN9, .F., .T.)
Através desse alias você já consegue consultar todos os campos retornados pela sua query, não havendo a necessidade dos Alias cAliasCNA e cAliasCNB.
Dessa forma, o preenchimento do seu Json ficaria da seguinte maneira:
oCont := nil
oCont := JsonObject():New()
oCont["codigoLojaCont"] := (cAliasCN9)->CN9_COD + (cAliasCN9)->CN9_LOJA
oCont["tipoContrato"] := ALLTRIM((cAliasCN9)->CN9_TPCTO)
oCont["numContract"] := ALLTRIM((cAliasCN9)->CN9_NUMERO)
oCont["codigoCliente"] := ALLTRIM((cAliasCN9)->CNA_CLIENT)
oCont["codigoLoja"] := ALLTRIM((cAliasCN9)->CNA_LOJACL)
oCont["codigoProduto"] := ALLTRIM((cAliasCN9)->CNB_PRODUT)
oCont["descricaoContrato"] := ALLTRIM((cAliasCN9)->CNB_DESCRI)
Para maiores informações sobre construção de queries em AdvPL: https://tdn.totvs.com.br/display/public/framework/Desenvolvendo+queries+no+Protheus