【问题标题】:Removing unused information from JSON从 JSON 中删除未使用的信息
【发布时间】: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 的通用类,并且该类的命令和子模式都可以扩展。
  • 你能说得具体一点吗?

标签: java json string


【解决方案1】:

你可以使用java jsonp:

JsonReader reader = Json.createReader(myJsonStream);
JsonObject obj = reader.readObject();

JsonBuilderFactory factory = Json.createBuilderFactory(null);
JsonObject myJson = factory.createObjectBuilder()
    .add("success", obj.get("success"))
    .add("cli", factory.createArrayBuilder()
        .add(factory.createObjectBuilder()
            .add("submode", obj.getJsonArray("cli").getJsonObject(1).get("submode")))).build();


FileOutputStream fs = new FileOutputStream("my_new_json_path");
JsonWriter wr = Json.createWriter(fs);
wr.writeObject(myJson);
wr.close();

已绑定到您的 json 结构,但它可以工作!

【讨论】:

  • 有没有办法在不使用 jsonp 的情况下做类似的事情?
  • 例如使用杰克逊?
  • 我的解决方案是使用 jsonp (jsr-353) 并且未绑定到实现,您可以使用 glassfish 或 jackson impl
  • 我试图实现你的建议,因为它实际上是我已经找到的最简单的方法,但是当我尝试运行它时,我得到以下异常:线程“main”javax.json 中的异常。 JsonException:在 javax.json.Json.createReader(Json.java:220) 的 javax.json.spi.JsonProvider.provider(JsonProvider.java:97) 中找不到提供程序 org.glassfish.json.JsonProviderImpl
  • 我错了,我也忘了包括 RI。无论如何,除了一件事,它工作得很好。我设法只得到一个 JSON 而不是全部。如上所述,这只是表示 nat 策略的一个示例。路由器的响应包括很多。怎么可能让其他人也一样?
猜你喜欢
  • 2017-01-23
  • 2019-09-18
  • 2019-06-16
  • 1970-01-01
  • 2012-09-25
  • 2023-02-26
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多