Получите правильный литерал JSON в Java 8, используя nashorn - PullRequest
1 голос
/ 07 мая 2019

У меня есть сообщение, которое должно быть отправлено через сокет, строка, представляющая json:

String message = "{\"sql\": \"{0}\"}";

Я использую MessageFormatter, чтобы вставить фактическое сообщение отпользователя и отправьте его на сервер.

Однако для понимания сервера это должна быть правильная строка JSON.

После манипуляции с ручным экранированием, понимая, что сообщение SQL может иметь вложенные кавычки и так далее, я понимаю, что хочу использовать подходящий инструмент JSON, чтобы убедиться, что строка является json-правильной.

Я хочу использовать нашорн, чтобы сохранить код ванили и избежать багажа в банке.

Нашорн кажется вполне способным и пригодным для этой задачи, но я продолжаю его поднимать, и я не уверен, что делать на этом этапе.

Я попробовал код из этого ответа :

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
ScriptObjectMirror json = (ScriptObjectMirror) engine.eval("JSON");
message = (String) json.callMember("stringify", json.callMember("parse", message));

Однако, это просто подтверждает мою строку, я хочу, чтобы nashorn фактически экранировал ее в правильной форме.

  • Я знаю о Джексоне.
  • Я знаю о других библиотеках JSON.

Любое понимание будет высоко ценится.

1 Ответ

1 голос
/ 07 мая 2019

Я нашел способ передать пользовательскую строку как переменную движку через Bindings.

Затем вы можете преобразовать в строку engine.eval("JSON.stringify()"):

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Bindings bindings = engine.getContext().getBindings(ScriptContext.GLOBAL_SCOPE);
bindings.put("sql_from_user", sql);
String proper_json_message = (String) engine.eval("JSON.stringify({sql : sql_from_user})");
...