---
name: assert_json_equal
kind: function
lang: go
domain: core
version: "1.0.0"
purity: pure
signature: "func AssertJSONEqual(expected, actual []byte) (bool, string)"
description: "Compara dos payloads JSON por igualdad semantica. Insensible al orden de claves. Retorna (true, \"\") si son equivalentes o (false, diff) con descripcion legible de la diferencia."
tags: [testing, json, assert, diff, pure]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: ["encoding/json", "fmt", "reflect"]
params:
  - name: expected
    desc: "payload JSON esperado como slice de bytes"
  - name: actual
    desc: "payload JSON real a comparar contra el esperado"
output: "(ok bool, diff string) — ok=true si son semanticamente iguales, diff con formato legible si difieren"
tested: true
tests:
  - "json identico retorna true y diff vacio"
  - "objetos con claves en distinto orden son iguales"
  - "valores distintos retorna false con diff"
  - "json invalido en expected retorna false con mensaje de error"
  - "json invalido en actual retorna false con mensaje de error"
  - "arrays con mismo contenido son iguales"
  - "arrays con distinto orden son distintos"
test_file_path: "functions/core/assert_json_equal_test.go"
file_path: "functions/core/assert_json_equal.go"
---

## Ejemplo

```go
ok, diff := AssertJSONEqual(
    []byte(`{"a":1,"b":2}`),
    []byte(`{"b":2,"a":1}`),
)
// ok = true, diff = ""

ok2, diff2 := AssertJSONEqual(
    []byte(`{"a":1}`),
    []byte(`{"a":2}`),
)
// ok2 = false, diff2 = "expected:\n{...}\n\nactual:\n{...}"
```

## Notas

Funcion pura. Usa json.Unmarshal a `any` seguido de reflect.DeepEqual para comparacion semantica — no textual. El diff incluye ambos JSONs formateados con indentacion para facilitar la inspeccion manual.
