GSON:字符串的自定义序列化
GSON : Custom serialization for String
public class Data{
public String str; //String (that may contain line breaks) I need to serialize as it is.
}
为什么我需要自定义字符串序列化程序?
如果没有自定义序列化程序,它会将其序列化为对象 {"str":{"count": 292,"hashCode": 0} }
我需要它 {"str":"..............."}
如何使用自定义序列化器来实现?
有自定义类型的自定义序列化程序示例,但找不到任何有助于序列化字符串类型的内容。
试试这个
public class DataSerializer implements JsonSerializer<Data> {
@Override
public JsonElement serialize(Data data, Type typeOfSrc, JsonSerializationContext context) {
JsonObject object = new JsonObject();
object.addProperty("src", data.src);
return object;
}
}
像这样将它添加到 Gson
Gson gson = new GsonBuilder()
.registerTypeAdapter(Data.class, new DataSerializer())
.create();
好吧,Gson 支持开箱即用的字符串,您不必自己实现任何字符串序列化程序,反之亦然。我猜你的情况可能只是导入了一个错误的字符串 class,比如说 import foo.bar.baz.String;
或不太明显的 import foo.bar.baz.*
,或者你只是有一个 String
class在声明 Data
class 的包中实现。(这无法解释真正分配给 str
的值,但是,它永远不会在 Java 导致 ClassCastException
)。错误的 class 可能用数字 count
和 hashCode
表示,没有任何 char[]
声明的字段,所以我不相信这是你的 java.lang.String
案件。此外,这里更假设的事情可能是使用反射将字符串类型适配器从 Gson
实例中丢弃,无论它听起来如何以及多么奇怪。在任何情况下,您甚至不必实现一行就可以使用 Gson 序列化 Java 字符串。
关于接受的答案:它不是最优的。如果,无论出于何种原因,你的导入没有任何问题,你的包没有声明自定义 String
class,并且你的 Gson
实例没有受到反射手术的影响,但 Gson 仍然将此类字符串序列化为嵌套对象(不知道为什么),您只需要一个特殊的 String
类型适配器,而无需为任何使用该怪异 [=13] 的 class 创建类型适配器=]作为一个字段:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(/*real.package.here.*/String.class, (JsonSerializer</*real.package.here.*/String>) (s, type, context) -> new JsonPrimitive(s.toString())) // whatever the real Java string is obtained
.create();
public class Data{
public String str; //String (that may contain line breaks) I need to serialize as it is.
}
为什么我需要自定义字符串序列化程序?
如果没有自定义序列化程序,它会将其序列化为对象 {"str":{"count": 292,"hashCode": 0} }
我需要它 {"str":"..............."}
如何使用自定义序列化器来实现?
有自定义类型的自定义序列化程序示例,但找不到任何有助于序列化字符串类型的内容。
试试这个
public class DataSerializer implements JsonSerializer<Data> {
@Override
public JsonElement serialize(Data data, Type typeOfSrc, JsonSerializationContext context) {
JsonObject object = new JsonObject();
object.addProperty("src", data.src);
return object;
}
}
像这样将它添加到 Gson
Gson gson = new GsonBuilder()
.registerTypeAdapter(Data.class, new DataSerializer())
.create();
好吧,Gson 支持开箱即用的字符串,您不必自己实现任何字符串序列化程序,反之亦然。我猜你的情况可能只是导入了一个错误的字符串 class,比如说 import foo.bar.baz.String;
或不太明显的 import foo.bar.baz.*
,或者你只是有一个 String
class在声明 Data
class 的包中实现。(这无法解释真正分配给 str
的值,但是,它永远不会在 Java 导致 ClassCastException
)。错误的 class 可能用数字 count
和 hashCode
表示,没有任何 char[]
声明的字段,所以我不相信这是你的 java.lang.String
案件。此外,这里更假设的事情可能是使用反射将字符串类型适配器从 Gson
实例中丢弃,无论它听起来如何以及多么奇怪。在任何情况下,您甚至不必实现一行就可以使用 Gson 序列化 Java 字符串。
关于接受的答案:它不是最优的。如果,无论出于何种原因,你的导入没有任何问题,你的包没有声明自定义 String
class,并且你的 Gson
实例没有受到反射手术的影响,但 Gson 仍然将此类字符串序列化为嵌套对象(不知道为什么),您只需要一个特殊的 String
类型适配器,而无需为任何使用该怪异 [=13] 的 class 创建类型适配器=]作为一个字段:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(/*real.package.here.*/String.class, (JsonSerializer</*real.package.here.*/String>) (s, type, context) -> new JsonPrimitive(s.toString())) // whatever the real Java string is obtained
.create();