Gson не разбирает переменную класса - PullRequest
4 голосов
/ 14 ноября 2011

Я использую Gson, и у меня есть объект, одним из полей которого является класс

class A {
…
private Class aClass;
… }

Когда я анализирую экземпляр в Json, используя объект Gson по умолчанию, aClass становится пустым.

Есть идеи почему?

Ответы [ 2 ]

5 голосов
/ 14 ноября 2011

Вам нужен адаптер нестандартного типа. Вот пример:

package com.sopovs.moradanen;

import java.lang.reflect.Type;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

public class GsonClassTest {
public static void main(String[] args) {
    Gson gson = new GsonBuilder()
            .registerTypeAdapter(Class.class, new ClassTypeAdapter())
            .setPrettyPrinting()
            .create();

    String json = gson.toJson(new Foo());
    System.out.println(json);

    Foo fromJson = gson.fromJson(json, Foo.class);
    System.out.println(fromJson.boo.getName());
}

public static class ClassTypeAdapter implements JsonSerializer<Class<?>>, JsonDeserializer<Class<?>> {

    @Override
    public JsonElement serialize(Class<?> src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.getName());
    }

    @Override
    public Class<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        try {
            return Class.forName(json.getAsString());
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

}

public static class Foo {
    Class<?> boo = String.class;
}
}

Вывод этого кода:

{
  "boo": "java.lang.String"
}
java.lang.String
3 голосов
/ 15 ноября 2011

Когда я анализирую экземпляр в Json, используя объект Gson по умолчанию, aClass становится пустым.

Есть идеи, почему?

В комментарии в выпуске 340 , менеджер проекта Gson объясняет:

Сериализация типов на самом деле является проблемой безопасности, поэтому мы не хотим поддерживать ее по умолчанию. Вредоносный файл .json может привести к тому, что ваше приложение загрузит классы, которые иначе не были бы; в зависимости от вашего пути к классам загрузка некоторых классов может сделать ваше приложение.

Но написать адаптер типа для поддержки этого в вашем приложении довольно просто.

Конечно, поскольку сериализация не совпадает с десериализацией, я не понимаю, как это объясняет отключенную сериализацию, если только не упомянутое понятие не должно в некотором смысле "сбалансировать" поведение сериализации по умолчанию с десериализацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...