杰克逊 - 可变键

时间:2016-03-04 15:21:01

标签: java json jackson

我遇到了一个小问题,我认为可以找到一些解决方法,但我正在寻找正确的方法。

我在网格中使用Selenium,然后使用JSON文件配置所有节点。某些浏览器(Chrome,IE)需要特定的驱动程序。

这些驱动程序由该表单的键定义:webdriver.browser.driver,浏览器= chrome 。所以,我们举个例子:

{"browserName": "chrome",
  "maxInstances": 5,
  "platform": "WINDOWS",
  "webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" }

{"browserName": "internet explorer",
  "maxInstances": 1,
  "platform": "WINDOWS",
  "webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe" }

我想获得价值并将其放入我的POJO的private String driverPath

有没有办法动态获取密钥的值?像正则表达式一样?

2 个答案:

答案 0 :(得分:0)

从概念上讲,在两个对象中,属性"webdriver.chrome.driver""webdriver.ie.driver"代表相同的实体:驱动程序,因此该属性应该只被称为驱动程序。

通常,POJO <-> JSON转化是一对一的,因此每个Java字段有一个JSON字段。

如果您无法更改JSON,或者您认为自己现在需要它们,至少在JacksonGSON,您可以注册自定义反序列化程序手动解析该值。

您可以在此处查看示例:http://www.baeldung.com/jackson-deserialization

答案 1 :(得分:0)

将其解析为List,例如使用jackson:

List<Map> list = (List<Map>) new ObjectMapper().readValue(json, List.class);

这里有一些工作代码:

String json = "[{\"browserName\": \"chrome\",  \"maxInstances\": 5,\n  \"platform\": \"WINDOWS\",\n" +
        "  \"webdriver.chrome.driver\": \"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe\" }," +
        "{\"browserName\": \"internet explorer\",  \"maxInstances\": 1," +
        "  \"platform\": \"WINDOWS\",  \"webdriver.ie.driver\": \"C:/Program Files (x86)/Internet Explorer/iexplore.exe\" }]";
List<Map> list = (List<Map>) new ObjectMapper().readValue(json, List.class);
String browser = "chrome";
String driver = list.stream()
    .<String>map(m -> (String) m.get("webdriver." + browser + ".driver"))
    .filter(s -> s != null)
    .findFirst()
    .orElse(null); // C:/Program Files (x86)/Google/Chrome/Application/chrome.exe
如果找不到,则

driver将为null