Render JSON arbitrario en HTML

Estoy escribiendo una página de visor de datos para representar los objetos que se envían como JSON desde el servidor. Los objetos JSON varían en contenido y complejidad, desde objetos planos con un puñado de atributos, hasta estructuras más grandes con varias capas de campos de agrupamiento y anidación. Lo que me gustaría hacer es representar una representación simple del objeto, probablemente como una ul. Desde allí puedo agregar cosas para permitir el comportamiento de expandir / contraer haciendo clic o algo.

Sé que esto requerirá una función recursiva a la que puedo llamar en el nivel superior, que luego será llamada nuevamente para cada nivel de anidamiento que descubra. Simplemente no tengo mucha confianza con Javascript, y no estoy llegando muy lejos con eso. También tengo problemas con el hecho de que no conozco los nombres de los atributos: los objetos diferentes tendrán atributos diferentes, con nombres diferentes.

¿Hay una forma relativamente simple de representar un objeto como este, o tendré que modificar la forma del JSON que el servidor está enviando?

EDITAR: Las muestras del JSON probablemente no ayudarán mucho; Ellos varían salvajemente. Como dije, algunos son simples, algunos son masivamente complejos. Los objetos más simples son algo como esto:

{
    "id": "5",
    "category": "12",
    "created": "25-Sep-2012"
}

Mientras que el más complejo que tengo actualmente es algo como esto:

{
   "Attempted":"EditUser",
   "Exception":{
      "Message":"Something",
      "TargetSite":"somewhere",
      "Inner Exception":{
         "Message":"Something else",
         "TargetSite":"somewhere.core",
             "Inner Exception":{
            "Message":"Another message",
            "TargetSite":"something.core.subr",
            "Inner Exception":{
               "Message":"Object reference not set to an instance of an object.",
               "TargetSite":"System.Web.Mvc.ActionResult Update(Int32, System.String, System.String)",
               "StackTrace":[
                  "at Application.Controllers.AdminController.Update(Int32 id, String email, String password) in c:\\Docs\\Apps\\Main\\MyBranch\\Source\\Application\\Application\\Controllers\\AdminController.cs:line 123"
               ],
               "Inner Exception":{

               }
            }
         }
      }
   },
   "details":{
      "userEmail":"[email protected]",
      "userId":"25",
      "userRole":"User"
   }
}

Como puede ver, es una representación JSON de un registro de errores, incluida la Excepción lanzada por el software (los detalles confidenciales se han ocultado). Los objetos JSON se generan a partir del campo "detalle" de un registro de auditoría, por lo que en el futuro puede haber otros eventos registrados cuyos detalles estén en un formato diferente al que predigo ahora, por lo que busco manejar JSON arbitrarios sin Confianza en conocer el formato.

Respuestas a la pregunta(4)

Su respuesta a la pregunta