【发布时间】:2015-09-27 22:32:29
【问题描述】:
我目前正在使用 SonicWall 路由器。我正在尝试从中获取一些信息以用于一个项目。我通过 SSH 连接到它,并且我选择了 JSON 作为输出格式来获取所有信息。我遇到的问题如下。对于简单的命令,返回的解析非常简单,但对于更复杂的命令,返回的 JSON 可能无效。
这是一个简短的示例(这些是 NAT 策略):
{
"success": true,
"cli": [
{ "command": [ { "token": "nat-policy" }, { "token": "inbound" }, { "token": "X1" }, { "token": "outbound" }, { "token": "X1" }, { "token": "destination" }, { "token": "name" }, { "token": "WAN Primary IP" }, { "token": "service" }, { "token": "name" }, { "token": "SNMP" } ] },
{ "submode": [
{ "command": [ { "token": "id" }, { "token": "0" } ] },
{ "command": [ { "token": "inbound" }, { "token": "X1" } ] },
{ "command": [ { "token": "outbound" }, { "token": "X1" } ] },
{ "command": [ { "token": "source" }, { "token": "any" } ] },
{ "command": [ { "token": "translated-source" }, { "token": "original" } ] },
{ "command": [ { "token": "destination" }, { "token": "name" }, { "token": "WAN Primary IP" } ] },
{ "command": [ { "token": "translated-destination" }, { "token": "original" } ] },
{ "command": [ { "token": "service" }, { "token": "name" }, { "token": "SNMP" } ] },
{ "command": [ { "token": "translated-service" }, { "token": "original" } ] },
{ "command": [ { "token": "enable" } ] },
{ "command": [ { "token": "comment" }, { "token": "Management NAT Policy" } ] },
{ "command": [ { "token": "exit" } ] }
] },
{ "command": [ { "token": "end" } ] }
] }
据我所知,返回 JSON 包含一个字段“success”和一个字段“cli”,其中包含一个字段“command”,它是一个令牌列表和一个字段“submode”,它是一个命令列表每个都持有一个令牌列表。
我想删除“命令”字段以及它持有的令牌列表,因此结果将是这样的:
{
"success": true,
"cli": [
{ "submode": [
{ "command": [ { "token": "id" }, { "token": "0" } ] },
{ "command": [ { "token": "inbound" }, { "token": "X1" } ] },
{ "command": [ { "token": "outbound" }, { "token": "X1" } ] },
{ "command": [ { "token": "source" }, { "token": "any" } ] },
{ "command": [ { "token": "translated-source" }, { "token": "original" } ] },
{ "command": [ { "token": "destination" }, { "token": "name" }, { "token": "WAN Primary IP" } ] },
{ "command": [ { "token": "translated-destination" }, { "token": "original" } ] },
{ "command": [ { "token": "service" }, { "token": "name" }, { "token": "SNMP" } ] },
{ "command": [ { "token": "translated-service" }, { "token": "original" } ] },
{ "command": [ { "token": "enable" } ] },
{ "command": [ { "token": "comment" }, { "token": "Management NAT Policy" } ] },
{ "command": [ { "token": "exit" } ] }
] }
] }
本质上我只想将“子模式”字段保留在命令列表中。
我在 Java 中执行此操作,但找不到将返回的 JSON 子字符串化以获得预期结果的方法。有人可以帮忙吗?
【问题讨论】:
-
您使用的是什么 JSON 处理库?使用 substring() 不是一个可靠的选择
-
我建议您创建一个 Java 类来解析该 Json(例如使用 Gson),然后使用这个解析的对象更容易。
-
我没有太多使用 JSON 的经验。我正在使用 Jackson 的默认解析器。我已经创建了适当的类来处理它,但我不能正确地处理它,因为 cli 列表包含两种不同类型的元素,我认为 Jackson 无法解析它。
-
所以你有 Object 来表示 JSON 组件?也许您可以创建一个名为 CliElement 的通用类,并且该类的命令和子模式都可以扩展。
-
你能说得具体一点吗?