oj: ParserError ("invalid escaped character") - not occurring in other JSON parsers
Hello, we’re using Oj in the new version of Exercism. Thank you for it 🙂
Running JSON.parse on the JSON below results in
JSON::ParserError (invalid escaped character (after tests[3].message) at line 1, column 382 [parse.c:234]
We’ve tested the same JSON in “normal” rails json parsing, Prettier, the built-in JSON parser of .NET, and the most popular JSON library in .NET, and they all parse it correctly, so we think this might be a bug in Oj. Would you mind taking a look please?
Thank you.
{"status":"fail","message":null,"tests":[{"name":"omit_lower_case_greek_letters","status":"pass","message":"","output":""},{"name":"spaces","status":"pass","message":"","output":""},{"name":"string","status":"pass","message":"","output":""},{"name":"string_with_no_letters","status":"fail","message":"Expecting empty but was:<\"\uD83D\uDE00\uDE00\uD83D\uDE00\uDE00\uD83D\uDE00\uDE00\">java.lang.AssertionError: \nExpecting empty but was:<\"\uD83D\uDE00\uDE00\uD83D\uDE00\uDE00\uD83D\uDE00\uDE00\">[\n at SqueakyCleanTest.string_with_no_letters(SqueakyCleanTest.java:46), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62), \n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), \n at java.base/java.lang.reflect.Method.invoke(Method.java:566), \n at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59), \n at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12), \n at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56), \n at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17), \n at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306), \n at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100), \n at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366), \n at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103), \n at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63), \n at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331), \n at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79), \n at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329), \n at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66), \n at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293), \n at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306), \n at org.junit.runners.ParentRunner.run(ParentRunner.java:413), \n at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110), \n at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58), \n at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38), \n at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62), \n at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62), \n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), \n at java.base/java.lang.reflect.Method.invoke(Method.java:566), \n at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36), \n at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24), \n at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33), \n at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94), \n at com.sun.proxy.$Proxy2.processTestClass(Unknown Source), \n at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:119), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62), \n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), \n at java.base/java.lang.reflect.Method.invoke(Method.java:566), \n at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36), \n at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24), \n at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182), \n at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164), \n at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414), \n at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64), \n at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48), \n at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128), \n at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628), \n at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56), \n at java.base/java.lang.Thread.run(Thread.java:834)]","output":""},{"name":"ctrl","status":"pass","message":"","output":""},{"name":"empty","status":"pass","message":"","output":""},{"name":"leading_and_trailing_spaces","status":"pass","message":"","output":""},{"name":"combine_conversions","status":"fail","message":"expected:<\"[_AbcĐ]CTRL\"> but was:<\"[9_AbcĐ\uD83D\uDE00\uDE00]CTRL\">org.junit.ComparisonFailure: expected:<\"[_AbcĐ]CTRL\"> but was:<\"[9_AbcĐ\uD83D\uDE00\uDE00]CTRL\">[\n at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method), \n at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62), \n at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45), \n at SqueakyCleanTest.combine_conversions(SqueakyCleanTest.java:64), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62), \n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), \n at java.base/java.lang.reflect.Method.invoke(Method.java:566), \n at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59), \n at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12), \n at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56), \n at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17), \n at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306), \n at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100), \n at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366), \n at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103), \n at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63), \n at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331), \n at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79), \n at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329), \n at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66), \n at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293), \n at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306), \n at org.junit.runners.ParentRunner.run(ParentRunner.java:413), \n at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110), \n at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58), \n at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38), \n at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62), \n at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62), \n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), \n at java.base/java.lang.reflect.Method.invoke(Method.java:566), \n at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36), \n at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24), \n at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33), \n at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94), \n at com.sun.proxy.$Proxy2.processTestClass(Unknown Source), \n at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:119), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method), \n at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62), \n at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), \n at java.base/java.lang.reflect.Method.invoke(Method.java:566), \n at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36), \n at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24), \n at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182), \n at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164), \n at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414), \n at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64), \n at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48), \n at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128), \n at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628), \n at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56), \n at java.base/java.lang.Thread.run(Thread.java:834)]","output":""},{"name":"kebab_to_camel_case","status":"pass","message":"","output":""},{"name":"single_letter","status":"pass","message":"","output":""}],"version":2}
(cc @erikschierboom @jmrunkle)
About this issue
- Original URL
- State: closed
- Created 3 years ago
- Comments: 24 (13 by maintainers)
Released 3.13.7 with the change in default behaviour for mimic mode.
No worries. I am well aware of the what it’s like. I’ll get the changes made in the next day or two.
@evanleck I took a quick glance and see what the issue is. I’ll have a version you can check soon.
I’ll take a look at the unicode and see why an error is generated.