× Linguagem de Programação ADVPL

Perguntas Criação dinâmica de objetos. Criar instância de uma classe sem método. Projeto para leitura de JSON.

Mais
10 anos 6 meses atrás - 10 anos 6 meses atrás #17876 por arthurfragoso
Olá pessoas,

Esse é meu primeiro post aqui e acredito que esse tópico seja um pouco avançado. Vou tentar explicar da maneira mais clara que eu puder.

Estou desenvolvendo uma função para ler uma string JSON em ADVPL e vou disponibilizar o código para todos.

Tudo foi tranquilo (arrays, strings, números,...), o problema é como vou criar objetos.

De acordo com a documentação, eu preciso criar uma classe *fora de qualquer função*, e criar um método construtor para conseguir instanciar.

O problema é que para eu criar um objeto a partir de uma string JSON, eu preciso fazer isso de dentro de uma função.

---
Um exemplo do que eu estou tentando fazer:
// O que atualmente consigo:

aJsonTest := FromJson('[["usuarios",["arthur","joao","beatriz"]],["produtos",[["abacaxi", 3.55],["laranja",2.32]]]]')

MsgInfo(aJsonTest[1][2][1]) //-> Mostra: arthur


// O que quero fazer:

oJsonTest := FromJson('{"usuarios":["arthur","joao","beatriz"], "produtos":[["abacaxi", 3.55],["laranja",2.32]]}')

MsgInfo(oJsonTest:usuarios[1]) //-> Mostra: arthur


Eu sei que eu posso fazer alternativas e não usar objetos, mas acredito que podemos abrir um mundo de possibilidades se criarmos a função FromJson e ToJson que funcione de maneira correta.



Bom, o que eu pesquisei e descobri até agora:


do msobject.ch, descobri que a criação de classe é feita através das seguintes funções:
_ObjNewClass( <ClsNam> , [<SupCls>] ) 
_ObjClassData( <uVar>, [<Typ>], [<Scp>], [<uData>] )
_ObjEndClass( )

Ou seja, eu consigo criar uma classe de dentro de uma função, o problema é como vou instanciá-la para criar um objeto. A única maneira documentada que eu encontrei, é criando um método que retorne o Self.

O problema é que eu não consigo criar um método enquanto estou rodando de dentro de uma função:
#xtranslate METHOD <Met> CLASS <clas> [ VIRTUAL ]=> ;
		Function ___<clas>_AsMet_(<Met>)

Mas se olharmos para o código de criação de uma classe no clipper, vemos que lá é possível:
CLASS Test
  VAR FirstName
  VAR LastName
  METHOD New=TestNew
ENDCLASS

é igual a:
FUNCTION Test
  STATIC hClass := 0
  if hClass == 0
    __DefineClass("Test",)
    __AddVar("FirstName")
    __AddVar("LastName")
    __AddMethod("New", "TestNew")
    hClass := __MakeClass()
  end
RETURN __ClassIns(hClass)

No clipper eu conseguiria criar o objeto de maneira muito fácil, já que eu poderia usar o __ClassIns(), e descobri que no harbour é __CLSINST().

O problema é como eu poderia fazer isso em ADVPL? Provavelmente tem uma função similar no advpl, mas não está na documentação.

No clipper ficaria algo como:
FUNCTION FromJson(sJson)

// .........

    __DefineClass(cObj,)
    For i := 1 To len(cObjVar)
       __AddVar(cObjVar[i])
    Next i
    hClass := __MakeClass()
    oObj := __ClassIns(hClass)

// ......

RETURN uJson

Em ADVPL, algo similar a isso:
FUNCTION FromJson(sJson)

// .........

    _ObjNewClass(cObj,)
    For i := 1 To len(cObjVar)
       _ObjClassData(cObjVar[i])
    Next i
    _ObjEndClass()
    
    oObj := // e agora, como pego a instância?

// ......

RETURN uJson


Também tentei:
CLASS struct
    METHOD new() CONSTRUCTOR
ENDCLASS

METHOD new() Class struct
Return Self


FUNCTION FromJson(sJson)

// .........

    CLASS teste FROM struct
        DATA nome
        DATA idade
    ENDCLASS
    
    oObj1 := struct():new() // funciona
    oObj2 := teste():new()  // nao funciona

// ......

RETURN uJson
Ultima edição: 10 anos 6 meses atrás por arthurfragoso.

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 6 meses atrás - 10 anos 6 meses atrás #18547 por arthurfragoso
Como não descobri como fazer a criação dinâmica de objetos, então acabei usando Vetores Associativos.

Aqui está o link para a continuação do meu projeto:

www.masteradvpl.com.br/index.php/forum/2...tivos-em-advpl#18546
Ultima edição: 10 anos 6 meses atrás por arthurfragoso.

Por favor Acessar ou Registrar para participar da conversa.

Mais
9 anos 4 meses atrás #26779 por SBFerreira
Arthur,

Estou com dificuldades em usar JSON com ADVPL, é possível você me adicionar no skype (brenofs de coronel fabriciano/mg) para trocarmos umas ideias poder me ajudar?

Abraços

Por favor Acessar ou Registrar para participar da conversa.

Mais
9 anos 4 meses atrás #26789 por SBFerreira
Arthur,

O link enviado ajudou e muito, porém preciso saber como acessar um link para receber a string json. Tenho um serviço rodando em outro aplicativo ( 150.18.1.254/cga/site-verif-pedido.cgi?p...=01-707359&01-707360 ), preciso conectar o Microsiga nesse link para receber a string json e aí usar as instruções enviada no link.

Tem como me ajudar?

Obrigado!

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.115 segundos
Joomla templates by a4joomla