Java中如何实现FHIR与非FHIR混合对象的JSON序列化?
Java下混合普通对象与FHIR资源的JSON序列化解决方案
方案1:扩展Jackson自定义模块适配FHIR对象
Hapi-FHIR自带Jackson集成支持,直接通过自定义模块让Jackson识别FHIR资源即可:
- 引入Hapi-FHIR的Jackson相关依赖(比如
hapi-fhir-structures-r4+hapi-fhir-jackson) - 初始化FHIR上下文,将FHIR Jackson模块注册到Jackson的
ObjectMapper中 - 直接用这个
ObjectMapper序列化混合对象
示例代码:
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.jackson.FhirJacksonModule; import com.fasterxml.jackson.databind.ObjectMapper; // 初始化FHIR R4版本上下文 FhirContext fhirContext = FhirContext.forR4(); // 创建Jackson核心对象并注册FHIR序列化模块 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new FhirJacksonModule(fhirContext)); // 序列化包含普通属性、非FHIR POJO、FHIR资源的混合对象 YourHybridCdsHookObject cdsRequest = new YourHybridCdsHookObject(); // 填充各类字段:普通字符串、自定义POJO、FHIR Bundle/Patient等 String finalJson = objectMapper.writeValueAsString(cdsRequest);
方案2:混合使用Jackson与Hapi-FHIR序列化器手动合并
如果不想修改全局Jackson配置,拆分序列化逻辑手动合并结果:
- 用Jackson序列化混合对象里的普通属性和非FHIR POJO,得到基础JSON节点
- 用Hapi-FHIR的
IParser单独序列化FHIR资源,转成JSON节点 - 将FHIR节点合并到基础JSON中,生成最终结果
示例代码:
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.parser.IParser; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; // 初始化工具实例 ObjectMapper jacksonMapper = new ObjectMapper(); IParser fhirParser = FhirContext.forR4().newJsonParser(); YourHybridCdsHookObject cdsRequest = new YourHybridCdsHookObject(); // 1. 序列化非FHIR部分,得到基础JSON节点 JsonNode baseNode = jacksonMapper.valueToTree(cdsRequest); ObjectNode finalNode = (ObjectNode) baseNode; // 2. 单独序列化FHIR资源并合并到节点中 Bundle fhirBundle = cdsRequest.getBundle(); String bundleJson = fhirParser.encodeResourceToString(fhirBundle); JsonNode bundleNode = jacksonMapper.readTree(bundleJson); finalNode.set("bundle", bundleNode); // 3. 生成最终JSON字符串 String finalJson = jacksonMapper.writeValueAsString(finalNode);
方案3:为混合对象编写自定义Jackson序列化器
针对CDS Hooks这类固定结构的混合对象,写专属序列化器精准处理每个字段:
- 实现Jackson的
StdSerializer接口,指定目标混合对象类型 - 在序列化方法中,分别处理普通字段、非FHIR POJO、FHIR资源
- 注册自定义序列化器到
ObjectMapper后使用
示例代码:
import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.parser.IParser; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; public class CdsHookRequestSerializer extends StdSerializer<YourHybridCdsHookObject> { private static final IParser FHIR_PARSER = FhirContext.forR4().newJsonParser(); private static final ObjectMapper JACKSON_MAPPER = new ObjectMapper(); public CdsHookRequestSerializer() { super(YourHybridCdsHookObject.class); } @Override public void serialize(YourHybridCdsHookObject value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartObject(); // 处理普通字符串属性 gen.writeStringField("hook", value.getHook()); gen.writeStringField("hookInstance", value.getHookInstance()); // 处理非FHIR自定义POJO gen.writeFieldName("context"); JACKSON_MAPPER.writeValue(gen, value.getContext()); // 处理FHIR资源 gen.writeFieldName("bundle"); String bundleJson = FHIR_PARSER.encodeResourceToString(value.getBundle()); gen.writeRawValue(bundleJson); gen.writeEndObject(); } } // 使用时注册序列化器 ObjectMapper mapper = new ObjectMapper(); SimpleModule customModule = new SimpleModule(); customModule.addSerializer(YourHybridCdsHookObject.class, new CdsHookRequestSerializer()); mapper.registerModule(customModule); // 序列化混合对象 String cdsJson = mapper.writeValueAsString(yourCdsRequest);
内容的提问来源于stack exchange,提问作者granadaCoder
相关产品推荐
相关产品推荐

