Oj
почти полностью написан на c , поэтому я не собираюсь перепроектировать его, чтобы ответить на не по теме вопрос «почему не работает код».
Некоторый реверс-инжиниринг его поведения - это хорошо.
▶ Oj.dump(foo: "^bar")
#⇒ "{\":foo\":\"^bar\"}"
▶ Oj.dump(foo: "^rar")
#⇒ "{\":foo\":\"\\u005erar\"}"
Тем не менее, знает что-то о ^r
. Чтобы преодолеть эту проблему, подготовьте свой груз:
▶ Oj.load("{\"s\":{\"s\":[\"^rc\"]}}".gsub(/\^/, "\\u005e"))
#⇒ {"s"=>{"s"=>["^rc"]}}
FWIW, последняя версия Oj
на моей машине довольно хорошо анализирует ваш ввод, как без сбоев.