Как это перевети на использование библиотеки JACKSON?

Ответить
zesen
Сообщения: 7
Зарегистрирован: 07 янв 2012, 13:09

Как это перевети на использование библиотеки JACKSON?

Сообщение zesen » 30 янв 2012, 14:06

Здравствуйте! Сейчас используется библиотека GSON, хочу перейти на использование JACKSON (хотя бы попробовать, слышал, что работает быстрее). Для работы с датами и ByteArray создана такая обложка:

Код: Выделить всё

public class MyGsonWrapper
{
public static Gson getMyGson()
{
    GsonBuilder gsonBuilder = new GsonBuilder();

    gsonBuilder.registerTypeAdapter(Date.class, new GsonDateSerializer());
    gsonBuilder.registerTypeAdapter(Date.class, new GsonDateDeserializer());

    gsonBuilder.registerTypeAdapter(byte[].class, new GsonByteArraySerializer());

    return gsonBuilder.create();
}

static class GsonDateDeserializer implements JsonDeserializer<Date>
{
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
    {
        String s = json.getAsString().replace("/Date(", "").replace(")/", "");

        if (s.equals("")) return null;

        boolean isDateBefore1970 = false;
        if (s.length() > 0 && s.indexOf("-") == 0)
        {
            isDateBefore1970 = true;
            s = s.substring(1, s.length());
        }

        long offset = 0;
        if (s.length() > 5 && (s.indexOf("-") == s.length()-5 || s.indexOf("+") == s.length()-5))
        {               
            offset = Long.valueOf(s.substring(s.length()-4, s.length()-2))*60 + Long.valueOf(s.substring(s.length()-2, s.length()));

            if (s.indexOf("-") == s.length()-5) offset = -offset;

            s = s.substring(0, s.length()-5);
        }

        if (isDateBefore1970)
            return new Date(-Long.valueOf(s) - offset * 60 * 1000);
        else
            return new Date(Long.valueOf(s) + offset * 60 * 1000);

    }
}

static class GsonDateSerializer implements JsonSerializer<Date>
{
    public JsonElement serialize(Date date, Type typeOfT, JsonSerializationContext context)
    {
        return new JsonPrimitive("/Date(" + date.getTime() + ")/");
    }
}

static class GsonByteArraySerializer implements JsonSerializer<byte[]>
{
    public JsonElement serialize(byte[] data, Type typeOfT, JsonSerializationContext context)
    {
        return new JsonPrimitive(Base64.encodeBytes(data));
    }
}
} 
С ByteArray JACKSON работает и сам нормально, следовательно GsonByteArraySerializer не нужен, с датами в миллисекунды тоже там настраивается и он сам работает с ними, как я понимаю. Может я в чем то не прав? Помогите переделать, что бы перейти с GSON на JACKSON библиотеку. Как я понимаю, новая обвертка должна начинаться так:

Код: Выделить всё

 public class MyJsonWrapper     {

public static ObjectMapper getMyJson()
{
    ObjectMapper mapper = new ObjectMapper(new SmileFactory());

    SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null));

    module.addSerializer(Date.class, new JsonDateSerializer());
    module.addDeserializer(Date.class, new JsonDateDeserializer());

    module.addSerializer(byte[].class, new JsonByteArraySerializer());

    mapper.registerModule(module);

    return mapper;
}

static class JsonDateDeserializer implements JsonDeserializer<Date>
{

    public Date deserializeWithType(JsonParser jp, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws java.io.IOException, JsonProcessingException
    {

    }

static class JsonDateSerializer implements JsonSerializer<Date>
{
    public JsonParser serialize(Date date, Type typeOfT, Serializers context)
    {
        return new JsonPrimitive("/Date(" + date.getTime() + ")/");
    }
}

static class JsonByteArraySerializer implements JsonSerializer<byte[]>
{
    public JsonParser serialize(byte[] data, Type typeOfT, Serializers context)
    {
        return new JsonPrimitive(Base64.encodeBytes(data));
    }
} 
Раньше сериализация и десериализация проходили следующим образом:

MyGsonWrapper.getMyGson().toJson(MyObject) MyGsonWrapper.getMyGson().fromJson(response.Body, MyObject[].class);

Может эта обвертка и не нужна совсем, может на прямую обращаться к функциям JACKSON? Если она все таки нужна, подскажите как изменить. Если не нужна, то через какие какие именно функции из библиотеки осуществлять сериализация и десериализация и как к ним обращаться...

Ответить