阻止GSON序列化JSON字符串

The*_*eXL 6 java serialization json gson

我是gson的新手,并且有一些我没有找到答案的新问题,所以请耐心等待.StackOverflow和谷歌不是我的朋友:(

我有一个java类"User",它的一个属性"externalProfile"是一个包含已经序列化的JSON的Java String.当gson序列化User对象时,它会将externalProfile视为原语,从而转义JSON添加额外的斜杠等.我希望gson单独保留字符串,只是"按原样"使用它,因为它已经是有效且可用的JSON.

为了区分JSON字符串,我创建了一个名为JSONString的简单类,我尝试使用reader/writers,registerTypeAdapter,但没有任何作用.你能帮我吗?

public class User {
    private JSONString externalProfile;
    public void setExternalProfile(JSONString externalProfile) { this.externalProfile = externalProfile; }

}

public final class JSONString {
    private String simpleString;
    public JSONString(String simpleString) { this.simpleString = simpleString; }
}

public customJsonBuilder(Object object) {
    GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(GregorianCalendar.class, new JsonSerializer<GregorianCalendar>() {
            public JsonElement serialize(GregorianCalendar src, Type type, JsonSerializationContext context) {
                if (src == null) {
                    return null;
                }
                return new JsonPrimitive(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(src.getTime()));
            }
        });
        Gson gson = builder.create();
        return gson.toJson(object);
}
Run Code Online (Sandbox Code Playgroud)

例如,externalProfile将保存(作为String值):

{"profile":{"registrationNumber": 11111}}
Run Code Online (Sandbox Code Playgroud)

将其作为JSONString存储在User对象中后,我们将用户对象转换为JSON:

User user = new User();
user.setExternalProfile(new JSONString(externalProfile)),  
String json = customJsonBuilder(user);
Run Code Online (Sandbox Code Playgroud)

json会举办类似的活动:

{\"profile\":{\"registrationNumber\": 11111}}
Run Code Online (Sandbox Code Playgroud)

因此,externalProfile JSONString由gson序列化为String原语,在双引号前面添加额外的斜杠.我希望gson保持原样JSONString,因为它已经是可用的JSON.我正在寻找一个类型的适配器/读写器来做到这一点,但我无法让它工作.

The*_*eXL 7

正如亚历克西斯 C 所说:

首先将 externalProfile 存储为 JsonObject:

new Gson().fromJson(externalProfile, JsonObject.class));
Run Code Online (Sandbox Code Playgroud)

并在输出 User 对象时让 gson 再次序列化它。将产生完全相同的 JSON!


小智 7

我解决了它,没有不必要的反序列化序列化。创建类:

public class RawJsonGsonAdapter extends TypeAdapter<String> {

    @Override
    public void write(final JsonWriter out, final String value) throws IOException {
        out.jsonValue(value);
    }

    @Override
    public String read(final JsonReader in) throws IOException {
        return null; // Not supported
    }
}
Run Code Online (Sandbox Code Playgroud)

并在需要时通过注释使用它。例如:

public class MyPojo {
    @JsonAdapter(RawJsonGsonAdapter.class)
    public String someJsonInAString;

    public String normalString;
}
Run Code Online (Sandbox Code Playgroud)

就是这样。正常使用 Gson。