我正在编写一个简单的java程序来读取JSON文件并从中提取某些信息。但是,String的split函数不会在new line
OR \n
字符上拆分字符串。
以下是我的JSON文件 - sample.json
{
"seleniumLog": [
{
"commandName": "sendKeys",
"args": [
"[[\"testUSER\",\"xpath\\u003d//UIAApplication[1]/UIAWindow[2]/UIATextField[1]\"]]"
],
"result": "fail",
"subLogs": [
{
"commandName": "getCurrentWindowHandle",
"args": [
"{}"
],
"result": "Not implemented in this context, try switching into or out of a web view (WARNING: The server did not provide any stacktrace information)\nCommand duration or timeout: 6 milliseconds\nBuild info: version: '2.39.0', revision: 'ff23eac', time: '2013-12-16 16:11:15'\nSystem info: host: 'testUSER-SIRs-MacBook-Pro.local', ip: '127.0.0.1', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.8.5', java.version: '1.6.0_65'\nSession ID: aced75a4-2bd9-4147-8346-1973371d2f97\nDriver info: com.infostretch.automation.ui.webdriver.QAFExtendedWebDriver\nCapabilities [{platform=MAC, app=/Users/testUSER/IAirwaysPG.app, javascriptEnabled=true, browserName=, desired={\"app\":\"/Users/testUSER/IAirwaysPG.app\",\"platformVersion\":\"7.1\",\"deviceName\":\"iPhone Simulator\",\"platformName\":\"iOS\",\"browserName\":\"\"}, locationContextEnabled=false, version=, platformVersion=7.1, databaseEnabled=false, cssSelectorsEnabled=true, platformName=ios, deviceName=iPhone Simulator, browser_name=, webStorageEnabled=false, warnings={}, takesScreenshot=true}]",
"subLogs": []
}
]
}
],
"checkPoints": [
{
"message": "Browser: ",
"type": "Info",
"screenshot": "",
"subCheckPoints": []
},
{
"message": "sendKeys [\"testUSER\",\"xpath\\u003d//UIAApplication[1]/UIAWindow[2]/UIATextField[1]\"] into {1}",
"type": "TestStepFail",
"subCheckPoints": [
{
"message": "Not implemented in this context, try switching into or out of a web view (WARNING: The server did not provide any stacktrace information)\nCommand duration or timeout: 6 milliseconds\nBuild info: version: '2.39.0', revision: 'ff23eac', time: '2013-12-16 16:11:15'\nSystem info: host: 'testUSER-SIRs-MacBook-Pro.local', ip: '127.0.0.1', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.8.5', java.version: '1.6.0_65'\nSession ID: aced75a4-2bd9-4147-8346-1973371d2f97\nDriver info: com.infostretch.automation.ui.webdriver.QAFExtendedWebDriver\nCapabilities [{platform=MAC, app=/Users/testUSER/IAirwaysPG.app, javascriptEnabled=true, browserName=, desired={\"app\":\"/Users/testUSER/IAirwaysPG.app\",\"platformVersion\":\"7.1\",\"deviceName\":\"iPhone Simulator\",\"platformName\":\"iOS\",\"browserName\":\"\"}, locationContextEnabled=false, version=, platformVersion=7.1, databaseEnabled=false, cssSelectorsEnabled=true, platformName=ios, deviceName=iPhone Simulator, browser_name=, webStorageEnabled=false, warnings={}, takesScreenshot=true}]",
"type": "Fail",
"screenshot": "",
"subCheckPoints": []
}
]
}
],
"errorTrace": "org.openqa.selenium.WebDriverException: Not implemented in this context, try switching into or out of a web view (WARNING: The server did not provide any stacktrace information)\nCommand duration or timeout: 6 milliseconds\nBuild info: version: '2.39.0', revision: 'ff23eac', time: '2013-12-16 16:11:15'\nSystem info: host: 'testUSER-SIRs-MacBook-Pro.local', ip: '127.0.0.1', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.8.5', java.version: '1.6.0_65'\nSession ID: aced75a4-2bd9-4147-8346-1973371d2f97\nDriver info: com.infostretch.automation.ui.webdriver.QAFExtendedWebDriver\nCapabilities [{platform=MAC, app=/Users/testUSER/IAirwaysPG.app, javascriptEnabled=true, browserName=, desired={\"app\":\"/Users/testUSER/IAirwaysPG.app\",\"platformVersion\":\"7.1\",\"deviceName\":\"iPhone Simulator\",\"platformName\":\"iOS\",\"browserName\":\"\"}, locationContextEnabled=false, version=, platformVersion=7.1, databaseEnabled=false, cssSelectorsEnabled=true, platformName=ios, deviceName=iPhone Simulator, browser_name=, webStorageEnabled=false, warnings={}, takesScreenshot=true}]\n\tat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)\n\tat sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)\n\tat sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)\n\tat java.lang.reflect.Constructor.newInstance(Constructor.java:513)\n\tat org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193)\n\tat org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)\n\tat org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)\n\tat com.infostretch.automation.ui.webdriver.QAFExtendedWebDriver.execute(QAFExtendedWebDriver.java:199)\n\tat org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:569)\n\tat com.infostretch.automation.ui.webdriver.QAFExtendedWebDriver.execute(QAFExtendedWebDriver.java:188)\n\tat org.openqa.selenium.remote.RemoteWebDriver.getWindowHandle(RemoteWebDriver.java:444)\n\tat org.openqa.selenium.internal.seleniumemulation.Windows.<init>(Windows.java:38)\n\tat org.openqa.selenium.WebDriverCommandProcessor.setUpMethodMap(WebDriverCommandProcessor.java:190)\n\tat org.openqa.selenium.WebDriverCommandProcessor.<init>(WebDriverCommandProcessor.java:51)\n\tat com.infostretch.automation.ui.selenium.webdriver.QAFWebDriverCommandProcessor.<init>(QAFWebDriverCommandProcessor.java:53)\n\tat com.infostretch.automation.ui.UiDriverFactory.get(UiDriverFactory.java:74)\n\tat com.infostretch.automation.core.QAFTestBase.init(QAFTestBase.java:187)\n\tat com.infostretch.automation.core.QAFTestBase.getUiDriver(QAFTestBase.java:229)\n\tat com.infostretch.automation.ui.WebDriverTestBase.getDriver(WebDriverTestBase.java:40)\n\tat com.infostretch.automation.ui.webdriver.QAFExtendedWebElement.<init>(QAFExtendedWebElement.java:103)\n\tat com.infostretch.automation.ui.webdriver.QAFExtendedWebElement.<init>(QAFExtendedWebElement.java:114)\n\tat com.infostretch.automation.step.CommonStep.sendKeys_aroundBody8(CommonStep.java:75)\n\tat com.infostretch.automation.step.CommonStep$AjcClosure9.run(CommonStep.java:1)\n\tat org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)\n\tat com.infostretch.automation.step.JavaStepReporter$MockJavaStep.doExecute(JavaStepReporter.java:89)\n\tat com.infostretch.automation.step.BaseTestStep.execute(BaseTestStep.java:96)\n\tat com.infostretch.automation.step.JavaStep.baseExecute(JavaStep.java:89)\n\tat com.infostretch.automation.step.JavaStepReporter$MockJavaStep.execute(JavaStepReporter.java:104)\n\tat com.infostretch.automation.step.JavaStepReporter.javaTestStep(JavaStepReporter.java:70)\n\tat com.infostretch.automation.step.CommonStep.sendKeys(CommonStep.java:74)\n\tat main.tc.Login_TC1.login_with_common_step(Login_TC1.java:28)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)\n\tat java.lang.reflect.Method.invoke(Method.java:597)\n\tat org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)\n\tat org.testng.internal.Invoker.invokeMethod(Invoker.java:714)\n\tat org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)\n\tat org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)\n\tat org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)\n\tat org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)\n\tat org.testng.TestRunner.privateRun(TestRunner.java:767)\n\tat org.testng.TestRunner.run(TestRunner.java:617)\n\tat org.testng.SuiteRunner.runTest(SuiteRunner.java:334)\n\tat org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)\n\tat org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)\n\tat org.testng.SuiteRunner.run(SuiteRunner.java:240)\n\tat org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)\n\tat org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)\n\tat org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)\n\tat org.testng.TestNG.runSuitesLocally(TestNG.java:1149)\n\tat org.testng.TestNG.run(TestNG.java:1057)\n\tat org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)\n\tat org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)\n\tat org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)\n"
}
我的java代码。的 JsonLogParser.java 即可。忽略主要功能。我在这里简化了我的代码。
package com.test.parser;
import java.io.FileReader;
import com.google.gson.*;
public class JsonLogParser {
String filePath = "C:\\<PATH_TO>\\sample.json";
public static void parseJSON(String filePath){
try {
// read the json file
FileReader reader = new FileReader(filePath);
JsonParser jsonParser = new JsonParser();
JsonObject jsonGObject = (JsonObject) jsonParser.parse(reader);
String result = jsonGObject.getAsJsonArray("seleniumLog").get(0).getAsJsonObject().get("result").toString();
String errorTrace;
if(result.contains("fail")){
errorTrace = jsonGObject.get("errorTrace").toString();
errorTrace.replaceAll("\n", System.getProperty("line.separator"));
String lines[] = errorTrace.split(System.getProperty("line.separator")); // did not work
// String lines[] = errorTrace.split("\n"); // did not work
// errorTrace.indexOf("\n", errorTrace.indexOf("\n") + 1); // did not work
String errorTraceCSV = lines[0]; //always returns the entire Stack Trace. I'm expecting only first line here.
System.out.println("errorTraceCSV: " + errorTraceCSV);
}
}catch (Exception e) {
System.out.println(e.toString());
}
}
}
以上程序无法拆分换行符上的errorTrace元素。我想从整个堆栈跟踪中提取errorTrace的第一行。我在SO上尝试了近3-4种不同的解决方案。我上面提到的很少,但没有一个能奏效。
indexOf始终返回-1。 split函数获取整个堆栈跟踪。所以,它根本不会分裂。
我想我在这里做了一些愚蠢的事。任何帮助表示赞赏。
此致 Rumit
答案 0 :(得分:0)
尝试使用
进行拆分split("[\\r\\n]+")
而不是两行
errorTrace.replaceAll("\n", System.getProperty("line.separator"));
String lines[] = errorTrace.split(System.getProperty("line.separator")); // did not work
使用此
String lines[] = errorTrace.split("[\\r\\n]+");
它应该有希望。