Я получаю Json, а затем используя Gson для десериализации его в объекте, где value является String, а не объектом. Поэтому я пытаюсь поместить этот объект в переменную String - не десериализован
Я хочу сделать что-то вроде этого:
"{value": {"id":"2"}}
→ {"value": "{\"id\":\"2\"}"}
Я заменил "value": {
с "value": "{
вот так:
result = result.replace("\"value\" : {", "\"value\" : \"{");
а затем я заменил}} следующим образом:
result = result.replace("}}", "}\"}");
И мой результат был (после замены всего):
{"value" : "{"id":"2","name":"game2"}"}
теперь единственная проблема: я также хочу заменить "
с \"
но только внутри "{
... }"
Я не могу понять это.
РЕДАКТИРОВАТЬ:
Входящий Json:
{"path" : "/gdi/games/2", "key" : "detail", "value" : {"id":"2","name":"game2"}},
{"path" : "/gdi/games/4", "key" : "detail", "value" : {"id":"4","name":"game4"}},
{"path" : "/gdi/games/6", "key" : "detail", "value" : {"id":"6","name":"game6"}}
Проблема: значение: может быть что угодно (текст), поэтому я хочу хранить все, что cames между {} в моем объекте, которое становится десериализованным в объекте, который выглядит так:
String path;
String key;
String value;
Чтобы достичь этого, мне нужно избежать объекта (который находится в "значении"), как будто это String. После того, как Gson может десериализовать его для меня.
Джонсу необходимо:
{"path" : "/gdi/games/2", "key" : "detail", "value" : "{\"id\":\"2\",\"\name\":\"game2\"}"},
{"path" : "/gdi/games/4", "key" : "detail", "value" : "{\"id\":\"4\",\"\name\":\"game4\"}"},
{"path" : "/gdi/games/6", "key" : "detail", "value" : "{\"id\":\"6\",\"\name\":\"game6\"}"}
Это делает трюк:
input = input.replaceAll("(?=\"[^{}]*\\})", "\\\\");
Он использует взгляд вперед, чтобы утверждать, что следующая фигурная скобка, найденная после двойной кавычки, является правильной фигурной фигурой - это означает, что двойная кавычка должна быть в паре фигурных скобок.
Сменный термин - буквальная обратная косая черта - четыре обратных слэша, необходимые из-за двойного сбега: один для строкового литерала java, один для escape-эффекта регулярного выражения.
Здесь некоторый тестовый код, использующий ваш образец ввода, создает ожидаемый результат:
String input =
"{\"path\" : \"/gdi/games/2\", \"key\" : \"detail\", \"value\" : {\"id\":\"2\",\"name\":\"game2\"}}," +
"{\"path\" : \"/gdi/games/4\", \"key\" : \"detail\", \"value\" : {\"id\":\"4\",\"name\":\"game4\"}}," +
"{\"path\" : \"/gdi/games/6\", \"key\" : \"detail\", \"value\" : {\"id\":\"6\",\"name\":\"game6\"}}";
input = input.replaceAll("(?=\"[^{}]*\\})", "\\\\");
System.out.println(input);
Вывод:
{"path" : "/gdi/games/2", "key" : "detail", "value" : {\"id\":\"2\",\"name\":\"game2\"}},
{"path" : "/gdi/games/4", "key" : "detail", "value" : {\"id\":\"4\",\"name\":\"game4\"}},
{"path" : "/gdi/games/6", "key" : "detail", "value" : {\"id\":\"6\",\"name\":\"game6\"}}
Вы можете использовать библиотеку Jackson
для сопоставления данных с классом. http://www.journaldev.com/2324/jackson-json-processing-api-in-java-example-tutorial
Для печати обратных косых черт - пример
public static void main(String[] args) {
String a="{\"id\":\"2\",\"name\":\"game2\"}";
System.out.println("Before - "+a);
System.out.println("After - "+a.replace("\"", "\\\""));
}
вывод -
Before - {"id":"2","name":"game2"}
After - {\"id\":\"2\",\"name\":\"game2\"}
вам просто нужно добавить double \, если вы хотите добавить "\", например: System.out.println("\\" "); напечатать это утверждение, которое вы получите: \" String abc: "\\" ";