序列化映射<日期,字符串>与杰克逊 [英] Serializing Map<Date, String> with Jackson

查看:134
本文介绍了序列化映射<日期,字符串>与杰克逊的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用杰克逊序列化一个Map。
日期应该被序列化为一个时间戳,就像所有其他日期一样。



以下代码以Tue Mar 11 00:00 :00 CET 1952(它是Date.toString())而不是时间戳。

  Map< Date,String> myMap = new HashMap< Date,String>(); 
...
ObjectMapper.writeValue(myMap)

我认为这是由于类型擦除和杰克逊在运行时不知道密钥是日期。但是我没有找到一种将TypeReference传递给任何writeValue方法的方法。

有没有一种简单的方法来实现我想要的行为,或者是所有的键总是呈现为字符串by jackson?



感谢您的任何提示。 默认map key serializer是 StdKeySerializer ,它只是做到了这一点。

 字符串keyStr =(value.getClass()== String.class)? ((String)value):value.toString(); 
jgen.writeFieldName(keyStr);

您可以使用 addKeySerializer 方法指定一个自定义键序列化程序。






这是如何完成的。


$ b

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

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.module.SimpleModule;
import org.codehaus.jackson.map.type.MapType;
import org.codehaus.jackson.map.type.TypeFactory;

public class CustomKeySerializerDemo
{
public static void main(String [] args)throws Exception
{
Map< Date,String> myMap = new HashMap< Date,String>();
myMap.put(new Date(),now);
Thread.sleep(100);
myMap.put(new Date(),later);

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(myMap));
// {Mon Jul 04 11:38:36 MST 2011:now,Mon Jul 04 11:38:36 MST 2011:later}

SimpleModule module =
new SimpleModule(MyMapKeySerializerModule,
new Version(1,0,0,null));
module.addKeySerializer(Date.class,new DateAsTimestampSerializer());

MapType myMapType = TypeFactory.defaultInstance()。constructMapType(HashMap.class,Date.class,String.class);

ObjectWriter writer = new ObjectMapper()。withModule(module).typedWriter(myMapType);
System.out.println(writer.writeValueAsString(myMap));
// {1309806289240:later,1309806289140:now}
}
}

class DateAsTimestampSerializer扩展了JsonSerializer< Date>
{
@Override
public void serialize(Date值,JsonGenerator jgen,SerializerProvider提供者)
抛出IOException,JsonProcessingException
{
jgen.writeFieldName(String .valueOf(value.getTime()));


$ / code $ / pre

$ hr

更新最新的Jackson(2.0.4):

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

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.databind.type.TypeFactory;

public class CustomKeySerializerDemo
{
public static void main(String [] args)throws Exception
{
Map< Date,String> myMap = new HashMap< Date,String>();
myMap.put(new Date(),now);
Thread.sleep(100);
myMap.put(new Date(),later);

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(myMap));
// {2012-07-13T21:14:09.499 + 0000:now,2012-07-13T21:14:09.599 + 0000:later}

SimpleModule模块= new SimpleModule();
module.addKeySerializer(Date.class,new DateAsTimestampSerializer());

MapType myMapType = TypeFactory.defaultInstance()。constructMapType(HashMap.class,Date.class,String.class);

ObjectWriter writer = new ObjectMapper()。registerModule(module).writerWithType(myMapType);
System.out.println(writer.writeValueAsString(myMap));
// {1342214049499:now,1342214049599:later}
}
}

class DateAsTimestampSerializer扩展了JsonSerializer< Date>
{
@Override
public void serialize(Date值,JsonGenerator jgen,SerializerProvider提供者)
抛出IOException,JsonProcessingException
{
jgen.writeFieldName(String .valueOf(value.getTime()));
}
}


I want to serialize a Map with Jackson. The Date should be serialized as a timestamp, like all my other dates.

The following code renders the keys in the form "Tue Mar 11 00:00:00 CET 1952" (which is Date.toString()) instead of the timestamp.

Map<Date, String> myMap = new HashMap<Date, String>();
...
ObjectMapper.writeValue(myMap)

I assume this is because of type erasure and jackson doesn't know at runtime that the key is a Date. But I didn't find a way to pass a TypeReference to any writeValue method.

Is there a simple way to achieve my desired behaviour or are all keys always rendered as Strings by jackson?

Thanks for any hint.

解决方案

The default map key serializer is StdKeySerializer, and it simply does this.

String keyStr = (value.getClass() == String.class) ? ((String) value) : value.toString();
jgen.writeFieldName(keyStr);

You could make use of the SimpleModule feature, and specify a custom key serializer, using the addKeySerializer method.


And here's how that could be done.

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

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.module.SimpleModule;
import org.codehaus.jackson.map.type.MapType;
import org.codehaus.jackson.map.type.TypeFactory;

public class CustomKeySerializerDemo
{
  public static void main(String[] args) throws Exception
  {
    Map<Date, String> myMap = new HashMap<Date, String>();
    myMap.put(new Date(), "now");
    Thread.sleep(100);
    myMap.put(new Date(), "later");

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(myMap));
    // {"Mon Jul 04 11:38:36 MST 2011":"now","Mon Jul 04 11:38:36 MST 2011":"later"}

    SimpleModule module =  
      new SimpleModule("MyMapKeySerializerModule",  
          new Version(1, 0, 0, null));
    module.addKeySerializer(Date.class, new DateAsTimestampSerializer());

    MapType myMapType = TypeFactory.defaultInstance().constructMapType(HashMap.class, Date.class, String.class);

    ObjectWriter writer = new ObjectMapper().withModule(module).typedWriter(myMapType);
    System.out.println(writer.writeValueAsString(myMap));
    // {"1309806289240":"later","1309806289140":"now"}
  }
}

class DateAsTimestampSerializer extends JsonSerializer<Date>
{
  @Override
  public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException
  {
    jgen.writeFieldName(String.valueOf(value.getTime()));
  }
}


Update for the latest Jackson (2.0.4):

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

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.databind.type.TypeFactory;

public class CustomKeySerializerDemo
{
  public static void main(String[] args) throws Exception
  {
    Map<Date, String> myMap = new HashMap<Date, String>();
    myMap.put(new Date(), "now");
    Thread.sleep(100);
    myMap.put(new Date(), "later");

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(myMap));
    // {"2012-07-13T21:14:09.499+0000":"now","2012-07-13T21:14:09.599+0000":"later"}

    SimpleModule module = new SimpleModule();
    module.addKeySerializer(Date.class, new DateAsTimestampSerializer());

    MapType myMapType = TypeFactory.defaultInstance().constructMapType(HashMap.class, Date.class, String.class);

    ObjectWriter writer = new ObjectMapper().registerModule(module).writerWithType(myMapType);
    System.out.println(writer.writeValueAsString(myMap));
    // {"1342214049499":"now","1342214049599":"later"}
  }
}

class DateAsTimestampSerializer extends JsonSerializer<Date>
{
  @Override
  public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException
  {
    jgen.writeFieldName(String.valueOf(value.getTime()));
  }
}

这篇关于序列化映射&lt;日期,字符串&gt;与杰克逊的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆