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.

Top, logica básica que a Totvs não faz por padrão e a gente quebra a cabeça sem.
Bom dia Marcio, tudo joia?
Obrigado pelo comentário e feedback.
Tenha uma ótima e abençoada segunda feira.
Um forte abraço.