Exemplo de como clonar um objeto JSON

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:

  1. Recebe um Objeto JSON
  2. Cria um novo JSON
  3. 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:

Exemplo da clonagem

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação