Namespace: framework.types.json

Função: Compare


Sintaxe

framework.types.json.Compare( < jJsonObject1 > , < jJsonObject2 > , [ @cRet ] ) -> lRet


Descrição

Realiza a comparação entre 2 objetos JSON por propriedade e valor.

Segundo a RFC 7159 que padroniza o JSON

An object is an unordered collection of zero or more name/value pairs, where a name is a string and a value is a string, number, boolean, null, object, or array.

Um objeto é uma coleção não ordenada de zero ou mais nomes/valores pares, onde um nome é uma string e um valor é uma string, number, boolean, null, object ou array.

Ao compararmos 2 objetos do tipo JSON, a alternativa mais óbvia seria converter os JSON para string e compará-los.  Porém, se a ordem das propriedades dos objetos for diferente, a comparação será falha.

Esta função tem como objetivo suprir esta demanda, fazendo uma comparação fiel entre os objetos JSON via propriedade/valor, independente da ordem das propriedades ou arrays.

Obs.: A classe JsonObject diferencia propriedades com nome maiúsculo das minúsculas. Por isso uma comparação entre JSONs com diferença de caixa irá resultar em diferenças pela função.


Parâmetros

NomeTipoDescriçãoDefaultObrigatório
jJsonObject1JSON/Array

JSON base da comparação


Sim

jJsonObject2JSON/Array

JSON a ser comparado


Sim
cRetCaractere

Variável de referência das mensagens de erros

NilNão

Obs.: A função aceita como argumento arrays de JSONOs dois primeiros argumentos devem ter o mesmo tipo de variável (JSON & JSON ou Array & Array).


Retorno

lRet JSONs iguais ou não.


Observações

  • Por conta de um comportamento padrão da JsonObject, não recomendamos utilizar o formato JSON array (ex.: [{}, {}]), somente JSON object (ex.: { "a": {}, "b": [] });
  • Caso seja necessário comparar arrays de JSON, recomendamos nomear o array (ex.: { "meuArray": [{}, {}] }) e passar o objeto nomeado no parâmetro da função (ex.: oMeuJson["meuArray"]
  • Disponível à partir da LIB versão 20211004 ou superior;
  • Essa função só funciona em binários com suporte a TLPP.


Exemplo chamada via PRW
#Include "protheus.ch"

User Function MyJsonCompare()
	Local lRet As Logical
	Local cRet As Character
	Local cJsonOne As Character
	Local cJsonTwo As Character
	Local jJson1 := JsonObject():New()
	Local jJson2 := JsonObject():New()

	cJsonOne := '{"propriedade": "valor","array":[{"valor1": true},{"valor2": true}]}'
	cJsonTwo := '{"propriedade": "valor","array":[{"valor1": true},{"valor2": false}]}'

	jJson1:FromJson(cJsonOne)
	jJson2:FromJson(cJsonTwo)

	lRet := framework.types.json.Compare(jJson1, jJson2, @cRet)

	If !lRet
		ConOut(cRet) // Resultado: array[2]=> Item at position 2 of aArray1 not found in aArray2.
	EndIf

	FreeObj(jJson1)
	FreeObj(jJson2)

Return Nil
Exemplo chamada via TLPP
#Include "tlpp-core.th"

Using Namespace framework.types.json

User Function MyJsonCompare()
	Local lRet As Logical
	Local cRet As Character
	Local cJsonOne := '{"propriedade": "valor","array":[{"valor1": true},{"valor2": true}]}' As Character 
	Local cJsonTwo := '{"propriedade": "valor","array":[{"valor1": true},{"valor2": false}]}' As Character 
	Local jJson1 := JsonObject():New() As Json
	Local jJson2 := JsonObject():New() As Json

	jJson1:FromJson(cJsonOne)
	jJson2:FromJson(cJsonTwo)

	lRet := Compare(jJson1, jJson2, @cRet)

	If !lRet
		ConOut(cRet) // Resultado: array[2]=> Item at position 2 of aArray1 not found in aArray2.
	EndIf

	FreeObj(jJson1)
	FreeObj(jJson2)

Return Nil