Побег "между струнами

1

Я получаю 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\"}"}
  • 2
    Похоже, вы должны начать с использования JSON API, а не пытаться манипулировать чем-то вроде JSON с помощью строковых операций. Какой контекст здесь?
  • 0
    Где ты это делаешь? В JSP? Вы используете Struts?
Показать ещё 4 комментария
Теги:
escaping
replace

3 ответа

1
Лучший ответ

Это делает трюк:

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\"}}
  • 0
    Это действительно помогло. Спасибо! Используя это так: result = result.replace ("\" value \ ": {", "\" value \ ": \" {"); result = result.replaceAll (" (? = \ "[^ {} ] * \\}) "," \\\\ "); result = result.replace ("}}", "} \"} "); Чтобы получить мой необходимый Json! Спасибо!
  • 2
    Не волнуйтесь. Удивительно, что вы можете сделать с правильным регулярным выражением!
0

Вы можете использовать библиотеку 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\"}
  • 0
    это все хорошо, я знаю, как заменить «на \», но моя проблема в том, что я хочу делать это только между «значением»: {...}
-2

вам просто нужно добавить double \, если вы хотите добавить "\", например: System.out.println("\\" "); напечатать это утверждение, которое вы получите: \" String abc: "\\" ";

  • 1
    это не проблема. "только внутри {..}" проблема
  • 0
    Спасибо @dave, вы правы, это моя проблема;)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню