GSON: Пользовательская сериализация для String - PullRequest
0 голосов
/ 23 сентября 2019
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.

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Ну, Gson поддерживает строки из коробки, и вам не нужно реализовывать какой-либо сериализатор строк и наоборот.Я полагаю, что в вашем случае может произойти просто импорт неверного строкового класса, скажем import foo.bar.baz.String; или менее очевидного import foo.bar.baz.*, или у вас просто есть реализация класса String прямо в пакете, где ваш класс Data объявлен в(Однако это не может объяснить, какие значения были действительно присвоены str - в Java это никогда не сработает, вызывая ClassCastException).Неправильный класс может быть указан числовыми count и hashCode без каких-либо объявленных char[] полей, поэтому я не верю, что это java.lang.String в вашем случае.Кроме того, более гипотетической вещью здесь может быть использование отражения, которое отбрасывает адаптер строкового типа из вашего экземпляра Gson, независимо от того, как и как странно это звучит.В любом случае вам не нужно реализовывать даже одну строку для сериализации строк Java с помощью Gson.

Что касается принятого ответа: он неоптимален.Если по какой-либо причине в ваших операциях импорта нет ничего плохого, ваш пакет не объявляет пользовательский класс 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();
0 голосов
/ 23 сентября 2019

Попробуйте это

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 Like this

Gson gson = new GsonBuilder()
.registerTypeAdapter(Data.class, new DataSerializer())
.create();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...