更改我的程序接受文件的方式将从GSON创建此错误:预期BEGIN_ARRAY但在第1行第2列路径$ BEGIN_OBJECT?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更改我的程序接受文件的方式将从GSON创建此错误:预期BEGIN_ARRAY但在第1行第2列路径$ BEGIN_OBJECT?相关的知识,希望对你有一定的参考价值。

关于这个主题有很多问题,但这个问题是不同的,因为我定义某个变量的方式决定了这个错误是否被抛出。

基本上,我有以下JSON文件:

[
  {
    "appiumVersion":"1.8.1",
    "buildTag": "build-0",
    "newCommandTimeout": "30",
    "deviceName":"Samsung Galaxy S9 WQHD GoogleAPI Emulator",
    "deviceOrientation":"portrait",
    "browserName":"",
    "platformName":"android",
    "platformVersion":"7.1",
    "app":"sauce-storage:ApiDemos-debug.apk"
  },
  {
    "appiumVersion":"1.8.1",
    "buildTag": "build-0",
    "newCommandTimeout": "30",
    "deviceName":"Samsung Galaxy S9 WQHD GoogleAPI Emulator",
    "deviceOrientation":"portrait",
    "browserName":"",
    "platformName":"Android",
    "platformVersion":"7.0",
    "app":"sauce-storage:ApiDemos-debug.apk"
  }
]

我正在使用GSON来解析它,这是它的代码:

File capsJsonFile = new File(capsFilePath);
Reader capsReader = null;

try {
    capsReader = new FileReader(capsJsonFile);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

Gson gsonCapsJsonArr = new Gson();

JsonObject[] capsJsonArr = gsonCapsJsonArr.fromJson(capsReader,  JsonObject[].class);

然后,我有另一个程序调用上面的代码:

capsFile = "C:\Users\exue\IdeaProjects\j-mobile\tests\src\test\resources\capsJsonArray.json";
AutomationFramework.setCapsFilePath(capsFile);

此代码将“capsFilePath”变量设置为“capsFile”。

奇怪的是,如果我这样编写程序,我就没有错误。但是,我想通过我用来运行这个程序的maven-surefire-plugin将这个capsFile字符串作为系统属性传递,如下所示:

capsFile = System.getProperty("capsFile");
AutomationFramework.setCapsFilePath(capsFile);

我将插件配置为如下所示:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.0</version>
    <configuration>
        <parallel>classes</parallel>
            <threadCount>4</threadCount>
        <redirectTestOutputToFile>false</redirectTestOutputToFile>
        <systemProperties>
            <property>
            <property>
                <name>capsFile</name>
                <value>C:\Users\exue\IdeaProjects\j-mobile\tests\src\test\resources\cfgJsonFile.json</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>

写完这样的文件,把文件作为系统属性,我现在得到这个错误:

[Utils] [ERROR] [Error] com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
        at com.google.gson.Gson.fromJson(Gson.java:939)
        at com.google.gson.Gson.fromJson(Gson.java:865)
        at com.transunion.qecop.automationframework.AutomationFramework.mobileDeviceDataProvider(AutomationFramework.java:208)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:74)
        at org.testng.internal.MethodInvocationHelper.invokeMethodNoCheckedException(MethodInvocationHelper.java:45)
        at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:131)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:706)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:49)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:37)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:924)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:70)
at com.google.gson.Gson.fromJson(Gson.java:927)
... 19 more

但是,如果我只是对字符串进行硬编码,则不会发生此错误。我在文件中输入的方式怎么可能导致这个错误?

答案

这个问题的原因是你指的是两个不同的JSON

你在字符串中传递的是capsJsonArray.json

而你在maven中传递的是cfgJsonFile.json

我认为问题在于json被称为可能是不正确的

以上是关于更改我的程序接受文件的方式将从GSON创建此错误:预期BEGIN_ARRAY但在第1行第2列路径$ BEGIN_OBJECT?的主要内容,如果未能解决你的问题,请参考以下文章

com.google.gson.ExclusionStrategy 类型定义了多次

开发中使用Gson的实例(时间格式错误解决方法)

如何使用Retrofit 2和Gson来模拟JSON响应“密钥”频繁更改的数据

处理 Windows 服务中的致命错误

遇到多线程问题同时连接到多个设备

根据GSON中的值从序列化中排除某些字段