2016-03-04 75 views
0

我面临一个小问题,我认为可以找到一些解决方法,但我正在寻找正确的方式来做到这一点。杰克逊 - 变键

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

这些驱动程序是由形式的一个关键定义:webdriver.browser.driver与浏览器= 。所以,我们已经有了例如:

{"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

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

+0

你应该用一个Pojo类映射Json –

+0

已经做到了,我说过了。 – buzz2buzz

+0

这是2个不同的json文件的内容?如果不是,则它是无效的json输入。如果你可以澄清输入,我可以告诉你如何分配存储空间,并使用jackson(java)提取你想要的东西。 – Andy

回答

0

从概念上讲,在这两个你的对象,属性"webdriver.chrome.driver""webdriver.ie.driver"代表相同的实体:司机,所以属性应该仅仅被称为驱动程序。

通常一个POJO <-> JSON转换是打算一对一,所以一个Java字段每JSON字段。

如果你不能改变JSON或者你觉得你需要他们像他们现在是正确的,至少在JacksonGSON,你可以注册一个自定义解串器和手动进行该值的解析。

你可以在这里看到的例子:http://www.baeldung.com/jackson-deserialization

0

使用解析它作为一个List,例如杰克逊:

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如果n是null ot发现