2014-12-07 2 views
3

Я использую json-io для преобразования некоторых данных JSON в Java объекты:Android: PatternSyntaxException: Синтаксическая ошибка U_ILLEGAL_ARGUMENT_ERROR

DataTransferContainer dataTransferContainer = (DataTransferContainer)JsonReader.jsonToJava(json); 

DataTransferContainer только объект, содержащий некоторые GeoJSON элементы. Для этого не имеет значения.

Приведенный выше код работает в тестовом JUnit за пределами Android, но когда я запускаю это на Android, я получаю эту RuntimeException:

12-07 20:12:51.260: E/AndroidRuntime(2002): FATAL EXCEPTION: AsyncTask #1 
12-07 20:12:51.260: E/AndroidRuntime(2002): java.lang.RuntimeException: An error occured while executing doInBackground() 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.lang.Thread.run(Thread.java:1019) 
12-07 20:12:51.260: E/AndroidRuntime(2002): Caused by: java.lang.ExceptionInInitializerError 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at com.mydomain.myapp.dataprocessing.JsonConverter.jsonObjectToObject(JsonConverter.java:22) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at com.mydomain.myapp.dataprocessing.DataManagerTask.processDataFromRemote(DataManagerTask.java:104) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at com.mydomain.myapp.dataprocessing.DataManagerTask.doInBackground(DataManagerTask.java:56) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at com.mydomain.myapp.dataprocessing.DataManagerTask.doInBackground(DataManagerTask.java:18) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  ... 4 more 
12-07 20:12:51.260: E/AndroidRuntime(2002): Caused by: java.util.regex.PatternSyntaxException: Syntax error U_ILLEGAL_ARGUMENT_ERROR 
12-07 20:12:51.260: E/AndroidRuntime(2002): (\d{2})[:.](\d{2})[:.](\d{2})[.](\d{1,10})([+-]\d{2}[:]?\d{2}|Z)? 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.regex.Pattern.compileImpl(Native Method) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.regex.Pattern.compile(Pattern.java:400) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.regex.Pattern.<init>(Pattern.java:383) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at java.util.regex.Pattern.compile(Pattern.java:374) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  at com.cedarsoftware.util.io.JsonReader.<clinit>(JsonReader.java:114) 
12-07 20:12:51.260: E/AndroidRuntime(2002):  ... 10 more 

В JsonReader, строка 114 выглядит следующим образом:

private static final Pattern timePattern1 = Pattern.compile("(\\d{2})[:.](\\d{2})[:.](\\d{2})[.](\\d{1,10})([+-]\\d{2}[:]?\\d{2}|Z)?"); 

Я смог сузить его. Это та часть: [:.]

Это просто означает «любой символ» или «двоеточие». Что не так с Android?

+0

Я могу подтвердить неполадку. – Stan

+2

BTW, изменение порядка решает проблему, то есть '[.:]' Принимается и кажется работающим, как ожидалось. Я понятия не имею, почему это не работает в Android. Также обратите внимание, что '.' означает точно« точку »здесь, а не какой-либо символ, потому что он находится внутри класса символов. – Stan

+0

Спасибо за подсказку. Тем временем я переписал библиотеку для своих целей, и я буду использовать для своей собственной версии Android. – Bevor

ответ

0

В шаблонах регулярных выражений ICU шаблон выражения скобок не может начинаться с :.

Вам нужно изменить шаблон для

Pattern.compile("(\\d{2})[.:](\\d{2})[.:](\\d{2})[.](\\d{1,10})([+-]\\d{2}:?\\d{2}|Z)?") 

Примечание изменения:

  • [:] изменяется на :
  • [:.] изменяется на [.:]

регулярное выражение библиотека, используемая в Android, является ICU, и одна из ее особенностей заключается в том, что она поддерживает классы символов POSIX вне скобки. Это означает, что вы можете написать [[:digit:]], чтобы соответствовать цифре, или [:digit:] (что недействительно в большинстве других вариантов регулярных выражений, включая POSIX). Анализатор регулярных выражений ICU, похоже, имеет проблемы с разбором выражений в скобках, начиная с : и, несомненно, это ошибка.

Смежные вопросы