Você já precisou clonar um objeto do tipo JSON? Veja como fazer isso no exemplo de hoje.
Pessoal, esse exemplo foi montado e gentilmente disponibilizado pelo grande Súlivan Simões ( LinkedIn ).
Então a ideia aqui, é ser algo similar a função aClone (de arrays), onde seja possível clonarmos um JSON (pelo menos até o momento que redigimos esse artigo ainda não tinha algo nativo do sistema).
Logo a lógica é então:
- Recebe um Objeto JSON
- Cria um novo JSON
- Pega a string do objeto JSON original (passo 1), e joga para o novo JSON (passo 2)
A função então fica dessa forma (junto com um exemplo):
#Include "Totvs.ch" /*/{Protheus.doc} jClone Clona um objeto do json e retorna. Atualmente não existe uma função ou método nativo para fazer isso, igual acontece com o aClone do array por exemplo @type Static Function @author Súlivan Simões (sulivansimoes@gmail.com) @since 19/10/2023 @version 1.0.0 @param oOldJson, Object, objeto json para ser clonado @return oNewJson, Object, objeto do novo json clonado @see https://tdn.totvs.com/pages/viewpage.action?pageId=274315041 /*/ User Function jClone(oOldJson) Local oNewJson:= JsonObject():New() oNewJson:FromJson(oOldJson:ToJson()) Return oNewJson /* Exemplo de uso da função Sem usar a função para clonar o objeto, a variavel aProdutos conteria sempre a referencia do mesmo objeto e no final o array todas as posições do array ficariam populados om o mesmo conteúdo */ User Function zTesteClone() Local oProduto := JsonObject():New() Local aProdutos := {} Local nCont := 1 For nCont := 1 To 5 oProduto['descricao'] := 'produto '+cValTochar(nCont) aAdd(aProdutos, u_jClone(oProduto) ) Next VarInfo("aProdutos",aProdutos) Return
Abaixo um outro exemplo de clonagem:
User Function zTesteClone() Local oJsonOrig := JsonObject():New() Local oJsonNovo //Define dois valores dentro do JSON original oJsonOrig['nome'] := 'João' oJsonOrig['idade'] := 30 //Agora clona o JSON oJsonNovo := u_jClone(oJsonOrig) //Altera os valores no JSON novo oJsonNovo['nome'] := 'Maria' oJsonNovo['idade'] := 28 //Mostra o resultado em tela ShowLog("Original: " + oJsonOrig:ToJson() + CRLF + "Novo: " + oJsonNovo:ToJson()) Return
E o print do resultado desse teste:
Bom pessoal, por hoje é só.
Abraços e até a próxima.