Java 如何避免Gson中的斜杠

Java 如何避免Gson中的斜杠,java,json,gson,Java,Json,Gson,根据规范,转义“/”是可选的 默认情况下,Gson不会这样做,但我正在处理一个Web服务,它需要转义“/”。所以我要发送的是“somestring\\/someotherstring”。关于如何实现这一点有什么想法吗 更清楚地说:如果我尝试用Gson反序列化“\\\/”,它将发送“\\\\/”,这不是我想要的 回答:自定义序列化程序 您可以编写自己的自定义序列化程序-我创建了一个序列化程序,它遵循您希望/成为\\/的规则,但是如果字符串已经转义,您希望它保持\\/而不是\\\/ package

根据规范,转义“
/
”是可选的

默认情况下,Gson不会这样做,但我正在处理一个Web服务,它需要转义“
/
”。所以我要发送的是“
somestring\\/someotherstring
”。关于如何实现这一点有什么想法吗

更清楚地说:如果我尝试用Gson反序列化“
\\\/
”,它将发送“
\\\\/
”,这不是我想要的

回答:自定义序列化程序 您可以编写自己的自定义序列化程序-我创建了一个序列化程序,它遵循您希望
/
成为
\\/
的规则,但是如果字符串已经转义,您希望它保持
\\/
而不是
\\\/

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"
注册自定义序列化程序

当然,您需要在安装时将此序列化程序传递给Gson,如下所示:

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

可下载和可执行示例 您可以在my github stackoverflow answers repo中找到此答案和确切示例:


另请参见

String someString=“/”;someString=someString.replace(“/”,“\\/”);System.out.println(someString)输出:>>\/@Selim,这没有帮助。检查我的edit@stoeflnSelim的意思是:在序列化之后(即在JSON字符串上)而不是之前进行替换。可能自定义TypeAdapter会有所帮助:@stoefln添加了一个可能满足您需要的答案:)如果您需要其他支持,请告诉我。
Gson gson = new GsonBuilder().registerTypeAdapter(String.class, new EscapeStringSerializer()).create();
String json = gson.toJson(yourObject);