Como desserializar JSON em uma estrutura plana semelhante a um mapa?
Tenha em mente que a estrutura JSON não é conhecida antes, ou seja, é completamente arbitrária, só sabemos que é o formato JSON.
Por exemplo,
O seguinte JSON
{
"Port":
{
"@alias": "defaultHttp",
"Enabled": "true",
"Number": "10092",
"Protocol": "http",
"KeepAliveTimeout": "20000",
"ThreadPool":
{
"@enabled": "false",
"Max": "150",
"ThreadPriority": "5"
},
"ExtendedProperties":
{
"Property":
[
{
"@name": "connectionTimeout",
"$": "20000"
}
]
}
}
}
Deve ser desserializado em estrutura semelhante a um mapa, com chaves como (não todas as opções acima incluídas por brevidade):
port[0].alias
port[0].enabled
port[0].extendedProperties.connectionTimeout
port[0].threadPool.max
Eu estou olhando para Jackson atualmente, então temos:
TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {};
Map<String, String> o = objectMapper.readValue(jsonString, typeRef);
No entanto, a instância do Mapa resultante é basicamente um mapa de mapas aninhados:
{Port={@alias=diagnostics, Enabled=false, Type=DIAGNOSTIC, Number=10033, Protocol=JDWP, ExtendedProperties={Property={@name=suspend, $=n}}}}
Enquanto eu preciso de mapa plano com teclas planas usando "notação de ponto", como o acima.
Eu prefiro não implementar isso sozinho, embora no momento eu não veja outra maneira ...