gpt4 book ai didi

java - 如何使用 Jackson 和 MongoDB 传递 JSON 消息中的属性?

转载 作者:IT老高 更新时间:2023-10-28 13:49:16 27 4
gpt4 key购买 nike

我们有一个微服务,它从队列中获取一些 JSON 数据,对其进行一点处理,然后将处理结果进一步发送 - 再次通过队列。在我们不直接使用 JSONObject 的微服务中,我们使用 Jackson 将 JSON 映射到 Java 类。

在处理时,微服务只对传入消息的一些属性感兴趣,而不是全部。想象一下它只是接收

{
"operand1": 3,
"operand2": 5,
/* other properties may come here */
}

并发送:

{
"operand1": 3,
"operand2": 5,
"multiplicationResult": 15,
/* other properties may come here */
}

如果不将它们显式映射到我的类中,我如何才能隧道或传递我对此服务不感兴趣的消息的其他属性?

对于这个微服务来说,有这样的结构就足够了:

public class Task {
public double operand1;
public double operand2;
public double multiplicationResult;
}

但是,如果我不映射所有其他属性,它们将会丢失。

如果我确实映射它们,那么每次消息结构发生变化时我都必须更新这个微服务的模型,这需要努力并且容易出错。

最佳答案

在敏捷结构的情况下,最简单的方法是使用 Map 而不是自定义 POJO:

很容易从 JSON 中读取,例如使用 JsonParser 解析器 (java docs here ):

Map<String, Object> fields =
parser.readValueAs(new TypeReference<Map<String, Object>>() {});

使用 BasicDBObject(java 文档 here)很容易写入 MongoDB:

DBCollection collection = db.getCollection("tasks");
collection.insert(new BasicDBObject(fields));

你甚至可以像这样用 Task 包裹 Map 来实现它:

public class Task {
private final Map<String, Object> fields;

public final double operand1;
// And so on...

@JsonCreator
public Task(Map<String, Object> fields) {
this.fields = fields;

this.operand1 = 0; /* Extract desired values from the Map */
}

@JsonValue
public Map<String, Object> toMap() {
return this.fields;
}
}

如果需要也可以使用自定义的JsonDeserializer(Task必须用@JsonDeserialize(using = TaskDeserializer.class)注解 在那种情况下):

public class TaskDeserializer extends JsonDeserializer<Task> {
@Override
public Task deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
Map<String, Object> fields = parser.readValueAs(new TypeReference<Map<String, Object>>() {});
return new Task(fields);
}

关于java - 如何使用 Jackson 和 MongoDB 传递 JSON 消息中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036545/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com