Renderizar JSON arbitrário em HTML

Estou escrevendo uma página de visualizador de dados para renderizar objetos sendo enviados como JSON do servidor. Os objetos JSON variam em conteúdo e complexidade, desde objetos planos com um punhado de atributos, até estruturas maiores com várias camadas de campos de aninhamento e matriz. O que eu gostaria de fazer é renderizar uma representação simples do objeto, provavelmente como ul. A partir daí, posso adicionar itens para permitir o comportamento de expandir / recolher clicável ou algo do tipo.

Eu sei que isso exigirá uma função recursiva que eu possa chamar no nível superior, que será então chamada novamente para cada nível de aninhamento descoberto. Eu não estou muito confiante com o Javascript, e não estou indo muito longe com isso. Também estou tendo problemas com o fato de não conhecer os nomes dos atributos - objetos diferentes terão atributos diferentes, com nomes diferentes.

Existe uma maneira relativamente simples de renderizar um objeto como este, ou terei que alterar a forma do JSON que o servidor está enviando?

EDIT: Amostras do JSON provavelmente não vão ajudar muito; eles variam muito. Como eu disse, alguns são simples, alguns são maciçamente complexos. Os objetos mais simples são algo assim:

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

enquanto o mais complexo que tenho atualmente é algo assim:

{
   "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 você pode ver, é uma representação JSON de um log de erros, incluindo a exceção lançada pelo software (detalhes confidenciais foram obscurecidos). Os objetos JSON são gerados a partir do campo "detail" de um log de auditoria, portanto, no futuro, pode haver outros eventos registrados cujos detalhes estão em um formato diferente de qualquer coisa que eu prever agora, e é por isso que estou tentando manipular o JSON sem dependência de conhecer o formato.

questionAnswers(4)

yourAnswerToTheQuestion