首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将ASObject序列化为JSON

如何将ASObject序列化为JSON
EN

Stack Overflow用户
提问于 2011-11-17 04:55:01
回答 2查看 682关注 0票数 0

我正在尝试将flex.messaging.io.amf.ASObject序列化和反序列化为JSON。ASObject扩展了HashMap并添加了一个额外的类型属性。默认情况下,Jackson会正确序列化对象下的所有键和值,但不会保留ASObject.getType()

使用Jackson,我已经成功地为ASObject创建了一个定制的序列化程序,现在序列化为:

代码语言:javascript
运行
复制
[{"@type":"org.me.MyClass","map":{"key":"value"}}]

这是通过添加额外的类型字段,然后委托回java.util.Map的标准处理程序来实现的。但是,我不确定如何配置Jackson以允许自定义反序列化,从而允许自定义处理。

也许我做错了!

EN

回答 2

Stack Overflow用户

发布于 2011-11-18 01:58:43

也许你也想创建自定义的反序列化程序?只要在反序列化时从上下文中知道类型(属性具有ASOBject类型),您可能并不真正需要该类型字段。

票数 0
EN

Stack Overflow用户

发布于 2011-11-22 12:38:12

这里有一种方法。

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8158528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档