Problemas para enviar un JSON

65 views
Skip to first unread message

Juan Miguel Solis

unread,
Aug 4, 2026, 1:33:10 PM (yesterday) Aug 4
to Comunidad de Visual Foxpro en Español
Buenas tardes

Probando para enviar u JSON, con la IA un amigo me encontro una funcion, que la primera parte funciona bien pero al llegar a esto, que pongo en rojo, me da error diciendo que no se encuentra estsa variable, pero no se que itine que tener esa variable, a ver si alguno sabe que peuden contener.


*--------------------------------------------------------------
* 2) Pasar los bytes a un stream binario
*    (NO enviar la cadena directamente: MSXML la recodificaria
*     a UTF-8 otra vez y romperia las tildes)
*--------------------------------------------------------------
oBody = CREATEOBJECT("ADODB.Stream")
oBody.Type    = adTypeText
oBody.Charset = "iso-8859-1"        && mapea 1:1 los 256 bytes, sin BOM
oBody.Open()
oBody.WriteText(cJson)
oBody.Position = 0
oBody.Type     = adTypeBinary       && solo se puede cambiar en Position = 0


Un saludo

Juan Miguel Solis

unread,
Aug 4, 2026, 3:39:49 PM (yesterday) Aug 4
to Comunidad de Visual Foxpro en Español
Buenas tardes/Noches/días

Bueno ya poco a poco fui solucionado los problemillas, ahora de momento solo me queda este :) :) , a ver si a alguien le suena.

-------------------------------------------------------------------------------------------------------------------------------

LOCAL cJson, oHttp, oBody, cResp, nStatus
nStatus = 0

#DEFINE adTypeBinary 1
#DEFINE adTypeText  2
#DEFINE adReadAll   -1

*---------------------------------------------------------------------------------------------------*
* 1) Leer el fichero (bytes tal cual) y quitar el BOM si lo tiene *
*---------------------------------------------------------------------------------------------------*
IF !FILE(cFileJson)
    MESSAGEBOX("No se encuentra el fichero:" + xCRLF + cFileJson, 16, "Error")
    RETURN .F.
ENDIF

cJson = FILETOSTR(cFileJson)
IF LEFT(cJson, 3) == CHR(239) + CHR(187) + CHR(191)   && BOM UTF-8 (EF BB BF)
   cJson = SUBSTR(cJson, 4)
ENDIF

IF EMPTY(cJson)
  MESSAGEBOX("El fichero esta vacio.", 16, "Error")
    RETURN .F.
ENDIF

*----------------------------------------------------------------------------------------------------*
* 2) Pasar los bytes a un stream binario -*

*    (NO enviar la cadena directamente: MSXML la recodificaria  *
*     a UTF-8 otra vez y romperia las tildes) -*
*----------------------------------------------------------------------------------------------------*


oBody = CREATEOBJECT("ADODB.Stream")
oBody.Type     = adTypeText
oBody.Charset = "iso-8859-1"        && mapea 1:1 los 256 bytes, sin BOM
oBody.Open()
oBody.WriteText(cJson)
oBody.Position = 0
oBody.Type     = adTypeBinary       && solo se puede cambiar en Position = 0

WAIT 'Llega hasta el control 2º' WINDOW AT 15,15 TIMEOUT 30

*--------------------------------------------------------------*
* 3) Enviar        *
*--------------------------------------------------------------*

TRY
oHttp = CREATEOBJECT("MSXML2.ServerXMLHTTP.6.0")  
oHttp.SetTimeouts(30000, 30000, 30000, 60000)  
  oHttp.Open("POST", cUrl, .F.)  
  oHttp.SetRequestHeader("X-API-KEY", cApiKey)  
  oHttp.SetRequestHeader("Content-Type", "application/json")
 
    oBody.Position = 0  
    oHttp.Send(oBody.Read(adReadAll))     && array de bytes, sin recodificar  
       
    nStatus = oHttp.Status

  cResp   = STRCONV(oHttp.ResponseText, 11)  && 11 = UTF-8 -> ANSI  
  Wait "HTTP - Status  " + TRANSFORM(nStatus) + " " + oHttp.StatusText  WINDOW AT 15,15 TIMEOUT 30
 
***   Hasta aqui llega bien, despues me aparece el mensaje "Cadena demasiado larga", y no se a que se refiere.  *****

  STRTOFILE(cResp, "respuesta.json")

  WAIT 'Llega hasta el control 4º' WINDOW AT 15,15 TIMEOUT 30
 
  CATCH TO oErr  
WAIT  "Error: " + oErr.Message WINDOW AT 15,15 TIMEOUT 30
FINALLY

    IF VARTYPE(oBody) = "O"      
    oBody.Close()  
    ENDIF  
    oBody = NULL  
    oHttp = NULL
   
   ENDTRY

RETURN nStatus

Victor Espina

unread,
Aug 4, 2026, 8:31:24 PM (yesterday) Aug 4
to Comunidad de Visual Foxpro en Español
Cambia esto:


cResp   = STRCONV(oHttp.ResponseText, 11)  && 11 = UTF-8 -> ANSI  
Wait "HTTP - Status  " + TRANSFORM(nStatus) + " " + oHttp.StatusText  WINDOW AT 15,15 TIMEOUT 30
STRTOFILE(cResp, "respuesta.json")
WAIT 'Llega hasta el control 4º' WINDOW AT 15,15 TIMEOUT 30

por esto:

Wait "HTTP - Status  " + TRANSFORM(nStatus) + " " + oHttp.StatusText  WINDOW AT 15,15 TIMEOUT 30
STRTOFILE( STRCONV(oHttp.ResponseText, 11) , "respuesta.json")
WAIT 'Llega hasta el control 4º' WINDOW AT 15,15 TIMEOUT 30


Saludos

Victor Espina

Juan Miguel Solis

unread,
6:56 AM (17 hours ago) 6:56 AM
to publice...@googlegroups.com
Hola Victor

Como siempre ayudando , muchas gracias lo primero, ahora efectivamente, crea el fichero respuesta.json y ya no aparece lo de "Cadena demasiado larga", pero ahora como pueda  convertir ese respuesta.json en algo entendible, me imagino que pasandolo a un capo memo o algo asi, que lo pueda leer y sacarlo por pantalla.

Un saludo

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/publicesvfoxpro/drCIQnWqH2c/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/13c641a3-1a36-43b4-81e6-60c56ed0117en%40googlegroups.com.

Juan Miguel Solis

unread,
7:01 AM (17 hours ago) 7:01 AM
to publice...@googlegroups.com
Hola Victor

Como siempre ayudando , muchas gracias lo primero, ahora efectivamente, crea el fichero respuesta.json y ya no aparece lo de "Cadena demasiado larga", pero ahora como pueda  convertir ese respuesta.json en algo entendible, me imagino que pasandolo a un capo memo o algo asi, que lo pueda leer y sacarlo por pantalla.

este es el fichero respuesta.json :

{"data":{"processingResult":[{"result":{"status":0,"message":"Se ha producido un error a la hora de validar la solicitud","code":"validation_failed","logTraceCode":"bgzyX7EudLYlWrNvA","errors":[{"code":"invalid_invoice_importe_total","message":"El Importe total debe ser igual a la suma de las bases imponibles m?s las cuotas del impuesto, m?s las cuotas recargo equivalencia del bloque Sujeta NoExenta, m?s la suma de las bases imponibles del bloque Sujeta Exenta y la suma de los impor...","source":"Invoice.ImporteTotal","type":"ValidationError"}]},"invoiceSerie":"F","invoiceNumber":"260611","expeditionDate":"2026-08-05T00:00:00Z","invoiceId":6,"establishmentCode":"00","operationId":12}],"operations":[]},"status":1}

Un saludo

Victor Espina

unread,
3:34 PM (8 hours ago) 3:34 PM
to Comunidad de Visual Foxpro en Español
Asumiendo que se trata de un string JSON, puedes parsearlo usando mi libreria JSON:

DO JSON
JSON.useFastParser = .T.   && Necesario para strings JSON grandes
LOCAL oData
oData = JSON.Parse(FILETOSTR("respuesta.json"))
IF JSON.lastError.hasError
    MESSAGEOX(JSON.lastERror.message)
   RETURN
ENDIF
* Aqui la varianle oData contendria los datoss de respuesta.json en forma de objeto

Si me envias el archivo respuesta.json puedo darte una mejor respuesta.

Victor Espina

Victor Espina

unread,
3:47 PM (8 hours ago) 3:47 PM
to Comunidad de Visual Foxpro en Español
Con ese ejemplo, lo podrias manejar asi con la libreria JSON:

DO JSON
JSON.useFastParser = .T.
LOCAL oData
oData = JSON.Parse( FILETOSTR("respuesta.json") )
IF JSON.lastError.hasError
    MESSAGEBOX(JSON.lastError.Message)
    RETURN
ENDIF

?oData.status   -->. "1"
?oData.procesingResult.Count. --> 1
?oData.Operations.Count --> 0

FOR EACH oResult IN oData.procesingResult
    ?"Status:",oResult.result.status
    ?"Message:", oResult.result.message
    ?"Code:", oResult.result.code
    ?"LogTraceCode:", oResult.result.logTraceCode
    ?"Error count:" oResult.result.errors.count
    FOR EACH oError IN oResult.result.errors
        ?,"Code:",oError.code
        ?,"Message:",oError.message
        ?,"Source:", oError.source
        ?,"Type:", oError.type
    ENDFOR
ENDFOR


Saludos

Victor Espina
Reply all
Reply to author
Forward
0 new messages