【发布时间】:2013-12-19 18:03:59
【问题描述】:
请记住,JSON 结构事先是未知的,即它是完全任意的,我们只知道它是 JSON 格式。
例如,
以下 JSON
{
"Port":
{
"@alias": "defaultHttp",
"Enabled": "true",
"Number": "10092",
"Protocol": "http",
"KeepAliveTimeout": "20000",
"ThreadPool":
{
"@enabled": "false",
"Max": "150",
"ThreadPriority": "5"
},
"ExtendedProperties":
{
"Property":
[
{
"@name": "connectionTimeout",
"$": "20000"
}
]
}
}
}
应该反序列化为类似 Map 的结构,其键如下(为简洁起见,并非所有上述内容都包括在内):
port[0].alias
port[0].enabled
port[0].extendedProperties.connectionTimeout
port[0].threadPool.max
我目前正在调查杰克逊,所以我们有:
TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {};
Map<String, String> o = objectMapper.readValue(jsonString, typeRef);
但是,生成的 Map 实例基本上是嵌套 Map 的 Map:
{Port={@alias=diagnostics, Enabled=false, Type=DIAGNOSTIC, Number=10033, Protocol=JDWP, ExtendedProperties={Property={@name=suspend, $=n}}}}
虽然我需要使用“点符号”的扁平键的扁平地图,就像上面一样。
我宁愿自己不实现这个,虽然目前我没有看到任何其他方式......
【问题讨论】:
-
Jackson(或任何其他 JSON 库)可以将 JSON 转换为地图地图。加倍努力并非易事,您展示的示例语法永远不会在运行时在 java 中生成。您可以使用Typesafe Config library 实现与您需要的类似的目标。
-
好的,所以我做了 Config parseString = ConfigFactory.parseString(portJsonString);其中 toString() 类似于: Config(SimpleConfigObject({"Port":{"Enabled":"false","Number":"10033","Type":"DIAGNOSTIC","@alias":"diagnostics" ,"ExtendedProperties":{"Property":{"@name":"suspend","$":"n"}},"Protocol":"JDWP"}})) 但我不知道如何展平这个通过 Typesafe Config 库?
-
添加了答案。希望对您有所帮助。