Пользовательский десериализатор Gson для класса String - PullRequest
0 голосов
/ 26 октября 2019

Я использую GSON для преобразования json в POJO, но значения ключей в json могут содержать пробелы, и я хотел их обрезать. Для этого я написал специальный десериализатор String, но он не работает. Вот что я хочу:

public class Foo {
  public int intValue;
  public String stringValue;

  @Override
  public String toString() {
      return "**" + stringValue + "**" ;
  }
}

public void testgson()
{
    String json = "{\"intValue\":1,\"stringValue\":\" one two  \"}";
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(String.class, new StringDeserializer());
    Gson gson = gsonBuilder.create();
    Foo a = gson.fromJson(json, Foo.class);
    System.out.println(a.toString()); //prints ** one two ** instead of **one two**

}

class StringDeserializer implements JsonDeserializer<String>
{
    @Override public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
        throws JsonParseException
    {
        String a = json.toString().trim();
        System.out.print(a); //prints ** one two **
        return a;
    }
}

Я ожидал, что результат будет **one two**, но это не так. Что я делаю не так

1 Ответ

1 голос
/ 26 октября 2019

В вашем StringDeserializer этот

json.toString()

вызывает toString для JsonElement, который является конкретно JsonPrimitive, содержащим значение, которое является текстом. Его toString реализация возвращает JSON-представление своего содержимого, которое в буквальном смысле является String " one two ". trim не делает то, что вам нужно, потому что эта строка заключена в ".

Что вы действительно хотели сделать, так это прочитать содержимое элемента JSON. Вы можете сделать это с помощью одного из удобных методов JsonElement: getAsString().

Так что

String a = json.getAsString().trim();

напечатает то, что вы ожидали.

...