2016-08-14 40 views
0

如果我使用从MongoDB的公报阶驱动程序的“本地” JSON支持:MongoDB的斯卡拉驱动程序自定义转换成JSON

val jsonText = Document(...).toJson()

它产生的JSON文本类型的前缀扩展类型:

{ "$oid" : "AABBb...." } - for ObjectID, 
{ "$longNumber" : 123123 } - for Long and etc. 

我想避免这种类型转换,并直接写入每种类型的值。有可能以某种方式覆盖某种类型的编码行为吗?

回答

0

您可以子类JsonWriter并覆盖writeXXX方法。例如,自定义日期序列化,你可以使用:

class CustomJsonWriter extends JsonWriter { 
    public CustomJsonWriter(Writer writer) { 
     super(writer); 
    } 

    public CustomJsonWriter(Writer writer, JsonWriterSettings settings) { 
     super(writer, settings); 
    } 

    @Override 
    protected void doWriteDateTime(long value) { 
     doWriteString(DateTimeFormatter.ISO_DATE_TIME 
      .withZone(ZoneId.of("Z")) 
      .format(Instant.ofEpochMilli(value))); 
    } 
} 

然后你可以使用重载版本的方法:

public static String toJson(Document doc) { 
     CustomJsonWriter writer = new CustomJsonWriter(new StringWriter(), new JsonWriterSettings()); 
     DocumentCodec encoder = new DocumentCodec(); 
     encoder.encode(writer, doc, EncoderContext.builder().isEncodingCollectibleDocument(true).build()); 
     return writer.getWriter().toString(); 
    }