public class Json { private ObjectNode objectNode; public Json() {} public Json(ObjectNode objectNode) { this.objectNode = objectNode; } public ObjectNode getObjectNode() { if (objectNode == null) { objectNode = JsonMapper.getMapper().createObjectNode(); } return objectNode; } public void setObjectNode(ObjectNode objectNode) { this.objectNode = objectNode; } @Override public int hashCode() { return Objects.hashCode(this.objectNode); } @Override public boolean equals(Object obj) { if (obj.getClass() != Json.class) { return false; } return Objects.equals(this.objectNode, ((Json)obj).objectNode); } } public class JsonCodec implements Codec { private final ObjectMapper objectMapper; private final BsonDocumentCodec bsonCodec; public JsonCodec(ObjectMapper objectMapper) { this.objectMapper = objectMapper; bsonCodec = new BsonDocumentCodec(); } @Override public Json decode(BsonReader reader, DecoderContext decoderContext) { String str = ""; try { BsonDocument doc = bsonCodec.decode(reader, decoderContext); str = doc.toJson(); return new Json(objectMapper.readValue(str, ObjectNode.class)); } catch (Exception ex) { throw new RuntimeException("Error mapping JSON from BSON reader : " + str, ex); } } @Override public void encode(BsonWriter writer, Json value, EncoderContext encoderContext) { String str = ""; try { str = objectMapper.writeValueAsString(value.getObjectNode()); BsonDocument doc = BsonDocument.parse(str); bsonCodec.encode(writer, doc, encoderContext); } catch (Exception ex) { throw new RuntimeException("Error encoding JSON to BSON writer : " + str, ex); } } @Override public Class getEncoderClass() { return Json.class; } }