【问题标题】:Best way to parse json using any jackson library [closed]使用任何杰克逊库解析 json 的最佳方法 [关闭]
【发布时间】:2018-06-27 15:45:39
【问题描述】:

对于一项正在进行的开发,外部休息服务正在返回如下响应:

{
    "type": "State",
    "id": "12344",
    "prodId": "wert",
    "players": 14,
    "feeds": {
        "abc123": {
            -----
        },
        "def1234": {
            -----
        },

        ---
        ---

        "someRandomAlphanumericValue": {

        }
    }
}

这里的需求是,我要解析这个JSON,并以java对象的格式输出,以便于访问。

【问题讨论】:

  • 您将需要创建类似于响应的模型类,您可以使用 fast-jackson api 将其解析为您创建的 java 模型
  • @Ishant,感谢您的评论,您可以看到密钥始终是随机值;那就是问题所在;所以将该随机值映射到 json 元素是没有意义的

标签: java jackson


【解决方案1】:

将随机字母数字属性设为Map<String, WhateverIsTheTypeTheyContain>

Jackson 会通过构建一个 HashMap 来绑定它们,并将这些属性添加到其中,属性名作为键,属性值作为值。

这是一个完整的例子:

鉴于当前包中保存为“feeds.json”的有效 JSON 文件:

{
  "id": "12344",
  "players": 14,
  "feeds": {
    "abc123": {
      "id": "1",
      "number": 1
    },
    "def1234": {
      "id": "2",
      "number": 2
    },
    "someRandomAlphanumericValue": {
      "id": "3",
      "number": 3
    }
  }
}

我们定义这些类以将其绑定到:

public class FeedContainer {
  private String id;
  private int players;
  private Map<String, Feed> feeds;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public int getPlayers() {
    return players;
  }

  public void setPlayers(int players) {
    this.players = players;
  }

  public Map<String, Feed> getFeeds() {
    return feeds;
  }

  public void setFeeds(Map<String, Feed> feeds) {
    this.feeds = feeds;
  }
}

public class Feed {
  private String id;
  private int number;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public int getNumber() {
    return number;
  }

  public void setNumber(int number) {
    this.number = number;
  }
}

现在我们可以用这个类来测试这些:

public class FeedContainerTry {

  public static void main(String[]args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();

    try(InputStream is = FeedContainerTry.class.getResourceAsStream("feeds.json")) {
      FeedContainer container = mapper.readValue(is, FeedContainer.class);
      container.getFeeds().forEach((key, feed) -> {
        System.out.println(key + ": " + feed.getId() + ", " + feed.getNumber());
      });
    }
  }
}

这表明我们可以访问所有属性

【讨论】:

  • 感谢您的帮助;你能帮我提供示例代码sn-p
  • @Creator 我会很感激你的尝试,但我编辑了我的答案以给出一个完整的例子。
  • 感谢工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2022-07-21
相关资源
最近更新 更多