1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

Duvida Tradução de json com Dataset

Discussão em 'EMS , HCM e Totvs 11' iniciado por tfofano, Março 20, 2026.

  1. tfofano

    tfofano Membro Participativo

    Boa tarde pessoal, tenho o seguinte programa:
    {esp/apirest.net.i}
    {esp/tt-ret.i}
    {esp/es250i01.i}
    {esp/ttOrderTudoEntregue.i} /* variaveis tt json*/
    {esp/tterroswms.i}
    DEFINE INPUT PARAMETER ip-id-layout AS INTEGER NO-UNDO.
    define input-output PARAMETER DATASET FOR dsOrders.
    DEFINE OUTPUT PARAMETER TABLE FOR tt-ret.
    {esp/varrest.wms.i ip-id-layout 31} //{&PAR-WMS-NRM}}
    def var responseArray as JsonArray no-undo.
    def var resourcePath as character no-undo.
    DEFINE VARIABLE lcJson AS longchar NO-UNDO.
    DEFINE VARIABLE jsonResponse AS JsonObject NO-UNDO.
    DEFINE VARIABLE jsonError AS JsonArray NO-UNDO.
    DEFINE VARIABLE errorObject AS JsonObject NO-UNDO.
    DEFINE variable c-ordItem AS CHARACTER NO-UNDO.
    if cToken = '' or cToken = ? then
    run esp/tokenbearerwmscurl.p(output ctoken,
    output table tt-ret).

    if return-value <> "OK" then do:
    for each tt-ret where tipo = 1:
    run pi-ret("NOK",1,"Erro ao buscar token: " + tt-ret.c-desc,no).
    end.
    return "NOK".
    end.
    FIND FIRST es-integracao-layout NO-LOCK
    WHERE es-integracao-layout.id-layout = ip-id-layout NO-ERROR.

    IF AVAIL es-integracao-layout THEN
    assign resourcePath = es-integracao-layout.metodo-wbs.
    ELSE
    ASSIGN resourcePath = ''.

    ASSIGN httpUrl = httpUrl + resourcePath. //ES249C01 - Método envio.
    if not cToken = '' or cToken = ? then
    run piGetDeliveries.
    PROCEDURE piGetDeliveries:
    DATASET dsDelivery:EMPTY-DATASET().
    oLib = ClientLibraryBuilder:Build()
    :sslVerifyHost(NO)
    :SetRequestTimeout(30)
    :Library.
    oReq = RequestBuilder:get(httpUrl)
    :AddHeader('Authorization', cToken)
    :AcceptJson()
    :ContentType('application/json')
    :Request.
    oResp = ClientBuilder:Build()
    :Client
    :Execute(oReq).
    IF oResp:StatusCode >= 400 THEN DO:
    jsonResponse = CAST(oResp:Entity, JsonObject).
    IF jsonResponse:Has("erros") THEN DO:
    jsonError = jsonResponse:GetJsonArray("erros").
    errorObject = jsonError:GetJsonObject(1).
    END.

    run pi-ret("NOK", 1, "Erro Delivery: " + string(oResp:StatusCode) + " - " +
    (if valid-object(errorObject) then errorObject:GetCharacter("message") else "Erro desconhecido"), NO).
    RETURN "NOK".
    END.
    IF VALID-OBJECT(oResp:Entity) THEN DO:

    IF TYPE-OF(oResp:Entity, JsonArray) THEN
    lcJson = CAST(oResp:Entity, JsonArray):GetJsonText().
    ELSE IF TYPE-OF(oResp:Entity, JsonObject) THEN
    lcJson = CAST(oResp:Entity, JsonObject):GetJsonText().

    IF lcJson <> "" AND lcJson <> ? THEN DO:
    DATASET dsDelivery:READ-JSON("LONGCHAR", lcJson, "EMPTY").
    RETURN "OK".
    END.
    /*
    IF TYPE-OF(oResp:Entity, JsonArray) THEN DO:
    DATASET dsDelivery:READ-JSON("JsonArray", CAST(oResp:Entity, JsonArray), "EMPTY").
    END.

    ELSE IF TYPE-OF(oResp:Entity, JsonObject) THEN DO:
    DATASET dsDelivery:READ-JSON("JsonObject", CAST(oResp:Entity, JsonObject), "EMPTY").
    END.
    */
    RETURN "OK".
    END.
    RETURN "NOK".

    END PROCEDURE.

    No momento:
    IF lcJson <> "" AND lcJson <> ? THEN DO:
    DATASET dsDelivery:READ-JSON("LONGCHAR", lcJson, "EMPTY").
    RETURN "OK".
    END.
    estou recebendo um erro:
    ---------------------------
    Erro
    ---------------------------
    Erro de parsing de JSON: esperado bracket, mas localizado brace. (15358)
    ---------------------------
    OK
    ---------------------------
    Não estou sabendo resolver, encaminho meu Dataset e um exemplo de retorno.

    Arquivos Anexados:

  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    É o formato do JSON que não está batendo com o formato do seu dataset.

    Minha dica: faça o caminho inverso, pra tu ter visibilidade.

    Preencha manualmente o dataset com suas temp-tables com valores, e faça o WRITE_JSON, e compara com o JSON que tu tá tentando ler.

    Assim tu vai conseguir comparar a estrutura esperada, e fazer as correções.
  3. tfofano

    tfofano Membro Participativo

    Opa, só pra dar uma atualizada, infelizmente tentei aqui, mas pelo que entendi o JSON vem fora do padrão, mudei alguns nomes ali das TT no serialize-name e dei um serialize-hidden no Dataset, mas não traduziu mesmo assim, recebi um erro, 'o atributo id não confere com o atributo Dataset' algo assim pelo que me lembro, então acabei fazendo o mapeamento manualmente mesmo, fazendo do i = 1, depois i = j e populando as temp-tables.

    Queria confirmar uma coisa, é possível com os Datasets, traduzir sempre um JSON que nos é retornado ou teremos casos como esse que o READ-JSON não consegue traduzir mesmo?
  4. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    Nem sempre é possível, quando não é , o ideal é usa objeto JsonObject, melhor que tratar string
  5. tfofano

    tfofano Membro Participativo

    É nesse caso, parei de transformar em longchar, peguei o Array, depois fui buscando o objects dentro dele, ai deu certo, mas como não tenho tanta prática com essas traduções tinha ficado na dúvida.
    rafael.andrade curtiu isso.
  6. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Desculpe se cheguei atrasado na conversa, mas vc olhou se o seu json estava em UTF-8 ou UTF-8 com BOM ???, o UTF-8 com BOM coloca 2 caracteres especiais no inicio do arquivo e dai vc não consegue ler
    rafael.andrade curtiu isso.

Compartilhe esta Página