我正在使用json-io将一些JSON数据转换为Java对象:
DataTransferContainer dataTransferContainer = (DataTransferContainer)JsonReader.jsonToJava(json);
DataTransferContainer只是一个包含一些GeoJson元素的对象。这个问题无关紧要。
以上代码适用于Android以外的JUnit测试,但是当我在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 :(得分: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正则表达式解析器似乎在解析以:
开头的括号表达式时遇到问题,当然这是一个错误。