【发布时间】:2015-08-29 05:41:45
【问题描述】:
我是 gson 的新手,并且有一些我没有找到答案的新问题,所以请多多包涵。 StackOverflow 和 google 不是我的朋友 :(
我有一个 java 类“User”,它的属性之一“externalProfile”是一个包含已序列化 JSON 的 Java 字符串。当 gson 序列化 User 对象时,它会将 externalProfile 视为原始对象,从而转义 JSON 添加额外的斜杠等。 我希望 gson 不理会字符串,只是“按原样”使用它,因为它已经是有效且可用的 JSON。
为了区分 JSON 字符串,我创建了一个名为 JSONString 的简单类,并尝试使用读取器/写入器 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);
}
作为示例,externalProfile 将保存(作为字符串值):
{"profile":{"registrationNumber": 11111}}
在我将它作为 JSONString 存储在 User 对象中之后,我们将 user 对象转换为 JSON:
User user = new User();
user.setExternalProfile(new JSONString(externalProfile)),
String json = customJsonBuilder(user);
json 将包含如下内容:
{\"profile\":{\"registrationNumber\": 11111}}
因此,gson 将 externalProfile JSONString 序列化为 String 原语,在双引号前添加额外的斜杠。 我希望 gson 保持这个 JSONString 不变,因为它已经是可用的 JSON。 我正在寻找一个类型适配器/读写器来执行此操作,但我无法让它工作。
【问题讨论】:
-
能否提供输入示例,以便我们重现并尝试解决您的问题?
-
嗨@Alexis C.,我已将其添加到我最初的问题中。谢谢!
-
是的,我做了@Reek,但我确实想要响应中的 externalProfile!所以它应该是对象序列化输出的一部分,但我希望 gson 不理会它(并防止双重序列化)。
-
嗯,一个肮脏的解决方案可能首先排除该属性并将其手动添加到序列化响应中。或者,先反序列化externalProfile,再序列化User?
标签: java json serialization gson