Как сериализовать ASObject в JSON - PullRequest
0 голосов
/ 17 ноября 2011

Я пытаюсь сериализовать и десериализовать flex.messaging.io.amf.ASObject в JSON.ASObject расширяет HashMap и добавляет дополнительное свойство типа.По умолчанию Джексон правильно сериализует все ключи и значения в объекте, но не сохраняет ASObject.getType().

. Используя Джексона, мне удалось создать собственный сериализатор для ASObject, и теперь я сериализую как:

[{"@type":"org.me.MyClass","map":{"key":"value"}}]

Это было путем добавления дополнительного поля типа, а затем делегирования обратно стандартному обработчику для java.util.Map.Однако я не уверен, как я могу настроить Джексона, чтобы разрешить пользовательскую десериализацию, чтобы разрешить пользовательскую обработку этого.

Возможно, я поступаю неправильно!

Ответы [ 2 ]

0 голосов
/ 22 ноября 2011

Вот один подход.

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.module.SimpleModule;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    ASObject asObject = new ASObject();
    asObject.type = Bar.class;
    asObject.put("1", "alpha");
    asObject.put("TWO", "beta");

    SimpleModule module = new SimpleModule("SimpleModule", Version.unknownVersion());
    module.addSerializer(ASObject.class, new ASObjectSerializer());
    ObjectMapper mapper = new ObjectMapper().withModule(module).setVisibility(JsonMethod.FIELD, Visibility.ANY);

    String asObjectJson = mapper.writeValueAsString(asObject);
    System.out.println(asObjectJson);
    // output: {"type":"com.stackoverflow.q8158528.Bar","map":{"1":"alpha","TWO":"beta"}}

    module = new SimpleModule("SimpleModule", Version.unknownVersion());
    module.addDeserializer(ASObject.class, new ASObjectDeserializer());
    mapper = new ObjectMapper().withModule(module).setVisibility(JsonMethod.FIELD, Visibility.ANY);

    ASObject asObjectCopy = mapper.readValue(asObjectJson, ASObject.class);
    System.out.println(asObjectCopy.equals(asObject));
    // output: true
  }
}

class ASObjectDeserializer extends JsonDeserializer<ASObject>
{
  @Override
  public ASObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
  {
    ASObject asObject = new ASObject();
    JsonNode tree = jp.readValueAsTree();
    try
    {
      asObject.type = Class.forName(tree.get("type").asText());
    }
    catch (ClassNotFoundException e)
    {
      System.exit(42);
    }
    asObject.putAll(jp.getCodec().treeToValue(tree.get("map"), Map.class));
    return asObject;
  }
}

class ASObjectSerializer extends JsonSerializer<ASObject>
{
  @Override
  public void serialize(ASObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
      JsonProcessingException
  {
    jgen.writeStartObject();
    jgen.writeStringField("type", value.type.getName());
    jgen.writeObjectField("map", new HashMap(value));
    jgen.writeEndObject();
  }
}

class ASObject extends HashMap
{
  Class type;

  @Override
  public boolean equals(Object o)
  {
    ASObject a = (ASObject) o;
    return type.equals(a.type) && super.equals(a);
  }
}

class Bar
{
}
0 голосов
/ 17 ноября 2011

Может быть, вы хотите создать собственный десериализатор?Вам может не понадобиться это поле типа, если тип известен из контекста при десериализации (свойство имеет тип ASOBject).

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