2015-04-01 2 views
1

В соответствии с характеристиками json экранирование «/» не является обязательным.Как избежать косых черт в Gson

Gson не делает это по умолчанию, но я имею дело с веб-сервисом, который ожидает бегство «/». Поэтому я хочу отправить «somestring\\/someotherstring». Любые идеи о том, как достичь этого?

Для того, чтобы прояснить ситуацию: если я пытаюсь десериализации «\\/» с Gson, он будет посылать «\\\\/», который не то, что я хочу!

+0

'Строка SomeString = "/"; someString = someString.replace ("/", "\\ /"); System.out.println (someString); ' выходы: >> \/ – Selim

+0

@ Селим, который не помогает. Проверьте мое редактирование – stoefln

+0

@stoefln Selim: замените ПОСЛЕ сериализации (т. Е. В строке JSON), а не раньше. –

ответ

2

Ответ: Пользовательские Serializer

Вы можете написать свой собственный Serializer - я создал один, который следует правилу, что вы хотите / быть \\/, но если строка уже убежали вы хотите, чтобы остаться \\/ и не будет \\\\/.

package com.dominikangerer.q29396608; 

import java.lang.reflect.Type; 

import com.google.gson.JsonElement; 
import com.google.gson.JsonPrimitive; 
import com.google.gson.JsonSerializationContext; 
import com.google.gson.JsonSerializer; 

public class EscapeStringSerializer implements JsonSerializer<String> { 

    @Override 
    public JsonElement serialize(String src, Type typeOfSrc, 
      JsonSerializationContext context) { 
     src = createEscapedString(src); 
     return new JsonPrimitive(src); 
    } 

    private String createEscapedString(String src) { 
     // StringBuilder for the new String 
     StringBuilder builder = new StringBuilder(); 

     // First occurrence 
     int index = src.indexOf('/'); 
     // lastAdded starting at position 0 
     int lastAdded = 0; 

     while (index >= 0) { 
      // append first part without a/
      builder.append(src.substring(lastAdded, index)); 

      // if/doesn't have a \ directly in front - add a \ 
      if (index - 1 >= 0 && !src.substring(index - 1, index).equals("\\")) { 
       builder.append("\\"); 
       // if we are at index 0 we also add it because - well it's the 
       // first character 
      } else if (index == 0) { 
       builder.append("\\"); 
      } 

      // change last added to index 
      lastAdded = index; 
      // change index to the new occurrence of the/
      index = src.indexOf('/', index + 1); 
     } 

     // add the rest of the string 
     builder.append(src.substring(lastAdded, src.length())); 
     // return the new String 
     return builder.toString(); 
    } 
} 

Это создаст из следующей строки:

"12 /first /second \\/third\\/fourth\\//fifth"` 

выход:

"12 \\/first \\/second \\/third\\/fourth\\/\\/fifth" 

Зарегистрируйте свой пользовательский Serializer

Чем, конечно, нужно пройти этот сериализатор в Gson on Setup следующим образом:

Gson gson = new GsonBuilder().registerTypeAdapter(String.class, new EscapeStringSerializer()).create(); 
String json = gson.toJson(yourObject); 

Загружаемых & исполняемого Пример

Вы можете найти этот ответ и точный пример в моем GitHub StackOverflow ответов репо:

Gson CustomSerializer to escape a String in a special way by DominikAngerer


Смотрите также

Смежные вопросы