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.
É 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.
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?
É 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.
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