Кроме того, это не так легко достичь с помощью регулярных выражений. В целях безопасности это должно быть гарантированное решение, которое не подвержено странным крайним случаям, и этот тип экранирования должен выполняться только для определенного поля в объекте JSON.
спользовании JSON-libJSONObject
как я могу остановитьput
метод хранения строки, которая содержит JSON как JSON, а не как экранированную строку?
Например:
JSONObject obj = new JSONObject();
obj.put("jsonStringValue","{\"hello\":\"world\"}");
obj.put("naturalStringValue", "\"hello world\"");
System.out.println(obj.toString());
System.out.println(obj.getString("jsonStringValue"));
System.out.println(obj.getString("naturalStringValue"));
печатает:
{"jsonStringValue":{"hello":"world"},"naturalStringValue":"\"hello world\""}
{"hello":"world"}
"hello world"
и я хочу это напечатать:
{"jsonStringValue":"{\"hello\":\"world\"}","naturalStringValue":"\"hello world\""}
{"hello":"world"}
"hello world"
Да, я понимаю, что это неприятно. Однако это поддерживает конвейер сериализации JSON, для которого, для обеспечения взаимодействия, это ожидаемое поведение. В некоторых случаях мы будем сериализовать пользовательский ввод, который может содержать / содержать действительный JSON. Мы бы не хотели, чтобы пользовательский ввод стал частью объекта JSON, с которым мы сериализуем указанный вход.
Ручное экранирование не работает, потому что это заставляет JSON-lib экранировать\
персонажи:
JSONObject obj = new JSONObject();
obj.put("naturalJSONValue","{\"hello\":\"world\"}");
obj.put("escapedJSONValue", "{\\\"hello\\\":\\\"world\\\"}");
System.out.println(obj.toString());
System.out.println(obj.getString("naturalJSONValue"));
System.out.println(obj.getString("escapedJSONValue"));
Выход:
{"naturalJSONValue":{"hello":"world"},"escapedJSONValue":"{\\\"hello\\\":\\\"world\\\"}"}
{"hello":"world"}
{\"hello\":\"world\"}
На этом этапе любые обходные пути для ручного выборочного экранирования сложного объекта JSON в первую очередь сводят на нет значение использования JSON-lib.
Также я понимаю, что этот вопрос был задандоНо, к сожалению, я не могу принять его ответ так легко. JSON-lib является широко используемой зависимостью во многих областях моего проекта, и замена ее была бы большой задачей. Мне нужно быть абсолютно уверенным, что с помощью JSON-lib невозможно достичь этой цели, прежде чем я смогу осуществить обмен на Джексона, Simple-JSON или Gson.