- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Criação dinâmica de objetos. Criar instância de uma classe sem método. Projeto para leitura de JSON.
×
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.
- arthurfragoso
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 6
- Obrigados Recebidos: 0
11 anos 1 mês atrás - 11 anos 1 mês atrás #17876
por arthurfragoso
Criação dinâmica de objetos. Criar instância de uma classe sem método. Projeto para leitura de JSON. foi criado 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:
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:
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:
Mas se olharmos para o código de criação de uma classe no clipper, vemos que lá é possível:
é igual a:
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:
Em ADVPL, algo similar a isso:
Também tentei:
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: 11 anos 1 mês atrás por arthurfragoso.
Por favor Acessar ou Registrar para participar da conversa.
- arthurfragoso
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 6
- Obrigados Recebidos: 0
11 anos 1 mês atrás - 11 anos 1 mês atrás #18547
por arthurfragoso
Respondido por arthurfragoso no tópico Criação dinâmica de objetos. Criar instância de uma classe sem método. Projeto para leitura de JSON.
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
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: 11 anos 1 mês atrás por arthurfragoso.
Por favor Acessar ou Registrar para participar da conversa.
- SBFerreira
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 2
- Obrigados Recebidos: 0
9 anos 11 meses atrás #26779
por SBFerreira
Respondido por SBFerreira no tópico Criação dinâmica de objetos. Criar instância de uma classe sem método. Projeto para leitura de JSON.
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
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.
- SBFerreira
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 2
- Obrigados Recebidos: 0
9 anos 11 meses atrás #26789
por SBFerreira
Respondido por SBFerreira no tópico Criação dinâmica de objetos. Criar instância de uma classe sem método. Projeto para leitura de JSON.
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!
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.
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Criação dinâmica de objetos. Criar instância de uma classe sem método. Projeto para leitura de JSON.
Tempo para a criação da página:0.113 segundos