【问题标题】:GSON : Custom serialization for StringGSON:字符串的自定义序列化
【发布时间】:2020-01-23 05:52:19
【问题描述】:
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":"..............."}

如何使用自定义序列化器?

有自定义类型的自定义序列化器示例,但找不到任何有助于序列化 String 类型的东西。

【问题讨论】:

    标签: android serialization gson


    【解决方案1】:

    好吧,Gson 支持开箱即用的字符串,您不必自己实现任何字符串序列化程序,反之亦然。我猜你的情况可能发生的只是导入了一个错误的字符串类,比如import foo.bar.baz.String;或不太明显的import foo.bar.baz.*,或者你只是在你的Data类声明的包中有一个String类实现. (这无法解释真正分配给str 的值,但是,它在Java 中永远不会工作,导致ClassCastException)。错误的类可能会用数字 counthashCode 表示,而没有任何 char[]-declared 字段,所以我不相信在你的情况下这是 java.lang.String。此外,这里更假设的事情可能是使用反射将字符串类型适配器从您的Gson 实例中丢弃,无论它听起来如何和多么奇怪。在任何情况下,您都不需要实现任何一行来使用 Gson 序列化 Java 字符串。

    关于公认的答案:这是次优的。如果无论出于何种原因,您的导入没有问题,您的包没有声明自定义 String 类,并且您的 Gson 实例没有遭受反射手术,但 Gson 仍然将此类字符串序列化为嵌套对象(有不知道为什么),您只需要一个特殊的 String 类型适配器,而无需为使用该奇怪 String 作为字段的任何类创建类型适配器:

    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();
    

    【讨论】:

      【解决方案2】:

      试试这个

      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();
      

      【讨论】:

      • Model类的字段多的话,也需要DataSerializer类来管理吧?
      • 字段 String str 被视为 Object 而不是 String 的原因可能是什么?
      • field String str 被视为 JSON,因为它的值是 JSON 格式
      • 是的,它可能是有效的 Json 格式字符串,但它是模型上的字符串类型的数据。有什么方法可以将其视为带有注释的字符串,或者只是简单而不为整个 Data 类编写 DataSerializer
      • stackoverflow.com/a/11272452/8166037 看看这个答案。它可以帮助您解决问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      相关资源
      最近更新 更多