Как исправить java.lang.IllegalStateException: ожидаемый BEGIN_ARRAY, но был строкой в cmd windows Gson, Apache Spark

#java #apache-spark #gson

#java #apache-spark #gson

Вопрос:

У меня есть этот фрагмент кода:

 File jsonFile = Paths.get(jsonPath).toFile();
BufferedReader bufferedReader = new BufferedReader(new FileReader(jsonFile));

Type collectionType = new TypeToken<List<Pattern>>(){}.getType();
List<Pattern> listPatterns = new Gson().fromJson(bufferedReader, collectionType);
  

когда я запускаю его в IntelliJ, он прошел успешно, но после сборки в jar-файл и запуска с помощью Spark-submit в windows CMD он получил ошибку:

 spark-submit --class com.bigdata.main.Application --master local[1] targetextraction.jar
  

Ошибка:

 Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1
        at com.google.gson.Gson.fromJson(Gson.java:815)
        at com.google.gson.Gson.fromJson(Gson.java:768)
        at com.bigdata.main.Application.main(Application.java:42)
        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.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
        at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:849)
        at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:167)
        at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:195)
        at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
        at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1
        at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:338)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:79)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
        at com.google.gson.Gson.fromJson(Gson.java:803)
        ... 14 more

  

мой файл json нормально запускается в командах IntelliJ и Centos Linux, но при запуске в Windows он выдает ошибку.

Содержимое Json:

 [
   {
      "bankName": "Bank1",
      "Patterns": [
         {
            "category": "daily",
            "type": "",
            "pattern": "pattern_regex_1"
         }
      ]
   },
   {
      "bankName": "Bank2",
      "Patterns": [
         {
            "category": "daily",
            "type": "",
            "pattern": "pattern_regex_2"
         },
         {
            "category": "daily",
            "type": "",
            "pattern": "pattern_regex_3"
         },
         {
            "category": "visa",
            "type": "",
            "pattern": "pattern_regex_4"
         },
         {
            "category": "visa",
            "type": "",
            "pattern": "pattern_regex_5"
         }
      ]
   }
]
  

Спасибо за вашу поддержку!

Комментарии:

1. можете ли вы предоставить содержимое файла JSON?

2. @vatsalmevada Я отредактировал содержимое файла JSON, спасибо!

3. Можете ли вы прочитать содержимое файла в строке и записать его. Убедитесь, что содержимое файла достаточно мало, чтобы избежать ООМ. Этот код может быть полезен: String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);

4. Почему этот вопрос помечен как Powershell, я вижу нулевую ссылку на него в фактическом сообщении?

5. @PMental У меня была ошибка, отредактировано, спасибо!

Ответ №1:

Спасибо, мистер @vatsalmevada, потому что он дал мне правильный ответ!

используйте:

 String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);
  

для преобразования

Комментарии:

1. эй, это был не ответ. Это был просто шаг отладки. Чтение всего файла в памяти нецелесообразно. Что делать, если размер вашего входного файла указан в GBs? Это приведет к ошибкам нехватки памяти. Пожалуйста, распечатайте прочитанный текст, используя приведенный мной код, и добавьте выходные данные в сообщение. Совпадает ли это с содержимым файла?