Erro ao montar o JSON

Boa tarde,

Estou montando um dataset que recebe duas constraints:

Código custom.js:

        if (campo1 || campo2 ) {
            dadosTabela.push({
            	itemContaI: campo1,
                numContaI: campo2,
                lacre: campo3,
                lacreExp: campo4,
                tara: campo5,
                dtRetirada: campo6,
              	hrRetirada: campo7,
              	dtCarregamento: campo8,
              	terminal: campo9,
              	tamContaI: campo10,
              	armador: campo11,
              	argola: campo12,
              	observacao: campo13,
              	placa1: campo14,
              	placa2: campo15
            });
        }
    });

    // Debug no console
    console.log("DEBUG - dadosTabela:", dadosTabela);
    
    // Monta parâmetros para o dataset
    var constraints = [
        DatasetFactory.createConstraint("contrato", $("#numRC").val(), $("#numRC").val(), ConstraintType.MUST),
        DatasetFactory.createConstraint("itens", JSON.stringify(dadosTabela), JSON.stringify(dadosTabela), ConstraintType.MUST)
    ];

var ds = DatasetFactory.getDataset("ds_wspost_contai", null, constraints, null);

    FLUIGC.toast({
        title: 'Envio API:',
        message: ds.values[0].mensagem,
        type: ds.values[0].status === "OK" ? 'success' : 'danger'
    });

Estes dados são recebidos no dataset para ser enviados para uma API externa:

var dsName = "ds_wspost_contai";
var _log = "## ds_wspost_contai ## ";



function defineStructure() {

}

function onSync(lastSyncDate) {
}

function createDataset(fields, constraints, sortFields) {
    var ds_wspost_contai = DatasetBuilder.newDataset();
    
    ds_wspost_contai.addColumn("status");
    ds_wspost_contai.addColumn("mensagem");

    try {
        // ==========================================================
        // Captura parâmetros enviados pelo custom.js
        // ==========================================================
        var contrato    = getParam(constraints, "contrato");
        var itensJSON   = getParam(constraints, "itens"); // deve vir como string JSON
        var contratoStr = "";
        
        // Detecta e converte para string pura
        if (typeof contrato === "object" && contrato !== null) {
            contratoStr = String(contrato);
        }
        
        log.info("CONTRATO => " + contratoStr);
        log.info("TIPO de contrato: " + typeof contratoStr);
        log.info("ITENS (JSON bruto) => " + itensJSON);
        log.info("TIPO de itensJSON: " + typeof itensJSON);
        
        // ==========================================================
        // Chama dataset ds_token_rest_protheus para obter token
        // ==========================================================
        var dsToken = DatasetFactory.getDataset("ds_token_rest_protheus", null, null, null);
        
        if (!dsToken || dsToken.rowsCount == 0) {
            ds_wspost_contai.addRow(["ERRO", "Não foi possível obter o token do Protheus"]);
            return ds_wspost_contai;
        }
        
        var token = dsToken.getValue(0, "access_token"); 
        
        // ==========================================================
        // Monta payload final para API
        // ==========================================================
        
        //log.info("PAYLOAD" + itensSanitizados);
        
        // Monta o payload limpo, igual ao do Postman
        var payload = {
            "contrato": contratoStr,
            "itens": itensJSON
        };
        
        // ==========================================================
        //  Faz POST para API usando fluigAPI.getAuthorizeClientService
        // ==========================================================
        var clientService = fluigAPI.getAuthorizeClientService();
        var data = {
            companyId: getValue("WKCompany") + '',
            serviceCode: 'protheus_rest', // Configurado no Painel de Integração do Fluig
            endpoint: '/fluig/api/wspostz02/v1/incluiContaI', // Caminho da API
            method: 'post',
            timeoutService: "1000",         // Tempo limite em segundos
            headers: {
                "Content-Type": 'application/json;charset=UTF-8',
                "Authorization": 'Bearer ' + token
            },
            params: JSON.stringify(payload)
        };
    
    
    var vo = clientService.invoke(JSON.stringify(data));
        
	var resultado = vo.getResult();

	if (resultado === "") {
    		ds_wspost_contai.addRow(["ERRO", "Sem resposta da API"]);
	} else {
    		ds_wspost_contai.addRow(["OK", resultado]);
	}

    } catch (e) {
        ds_wspost_contai.addRow(["EXCEPTION", e.toString()]);
    }

    return ds_wspost_contai;
}

function onMobileSync(user) {

}

// Função auxiliar para pegar parâmetros de constraints
function getParam(constraints, name) {
    if (constraints !== null) {
        for (var i = 0; i < constraints.length; i++) {
            if (constraints[i].fieldName == name) {
                return constraints[i].initialValue;
            }
        }
    }
    return "";
}

Os dados estão chegando como objetos e converto o contrato para string. Eles chegam neste formato:

CONTRATO => 010551
ITENS (JSON bruto) => [{"itemContaI":"01","numContaI":"TBRT 363666-6","lacre":"TESTE","lacreExp":"TESTE","tara":"1.000,00","dtRetirada":"","hrRetirada":"","dtCarregamento":"","terminal":"","tamContaI":"","armador":"","argola":"","observacao":"","placa1":"","placa2":""},{"itemContaI":"02","numContaI":"VREI 626262-6","lacre":"TESTE","lacreExp":"TESTE","tara":"5.000,00","dtRetirada":"","hrRetirada":"","dtCarregamento":"","terminal":"","tamContaI":"","armador":"","argola":"","observacao":"","placa1":"","placa2":""}]

Dito isso, é só montar o JSON, porém quando faço a montagem e dou um JSON.stringify(payload)) ele me retorna o erro, como senão conseguisse converter para JS puro.

Erro:

Envio API: InternalError: Java class "[Ljava.lang.reflect.Constructor;" has no public instance field or method named "toJSON". (Model#65)

Já tentei de tudo e não sei mais o que fazer.

Pelo que entendi tá acontecendo o mesmo problema que nessa postagem Importar XML de Processo via REST - #2 de Bruno_Gasparetto

A proriedade params espera um objeto pra ser convertido num Map<string, string>, mas você tá passando uma string.

Testa usar a propriedade strParams ao invés da params.

1 curtida

Boa tarde meu amigo,

Na verdade o itensJSON era um objeto e eu transformei ele em String e formatei com o JSON.parse e após isso utilizei o parâmetro strParams para envio do JSON.

Muito obrigado!

Outra dica e em calsa linha que deve se uma stringo use o String(“Sua string”)isso garante que teremos uma string paar fazer o stringfy