2014-12-07 71 views
3

我使用json-io一些JSON数据转换为Java对象:机器人: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 2014-12-15 22:48:39

+2

顺便说一句,改变顺序解决了这个问题,那就是'[。:]'被接受并且按预期工作。我不知道为什么它在Android中不能正常工作。另外请注意'.'在这里意味着“点”,而不是任何字符,因为它在字符类中。 – Stan 2014-12-15 23:17:14

+0

感谢您的提示。与此同时,我为我的目的重写了该库,并将使用Android作为我自己的版本。 – Bevor 2014-12-20 11:20:54

回答

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正则表达式解析器在解析括号表达式时出现问题,从:开始,肯定是一个错误。