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
Nome | Tipo | Descrição | Default | Obrigatório |
---|---|---|---|---|
jJsonObject1 | JSON/Array | JSON base da comparação | Sim | |
jJsonObject2 | JSON/Array | JSON a ser comparado | Sim | |
cRet | Caractere | Variável de referência das mensagens de erros | Nil | Não |
Obs.: A função aceita como argumento arrays de JSON. Os 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.
#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
#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