将JsonObject映射到类字段的最佳方法
我正在使用:将JsonObject映射到类字段的最佳方法,json,jackson,vert.x,java-11,Json,Jackson,Vert.x,Java 11,我正在使用: import io.vertx.core.json.JsonObject; 假设我们有一节课: class Foo { public String barStar; public boolean myBool; } 然后我们有一个JsonObject,如下所示: var o = new JsonObject(`{"bar_star":"yes","my_bool":true}`); 是否有某种内置机制将JsonObject映射到类中的匹配字段?我在想一些地图实例,比如
import io.vertx.core.json.JsonObject;
假设我们有一节课:
class Foo {
public String barStar;
public boolean myBool;
}
然后我们有一个JsonObject,如下所示:
var o = new JsonObject(`{"bar_star":"yes","my_bool":true}`);
是否有某种内置机制将JsonObject映射到类中的匹配字段?我在想一些地图实例,比如:
Foo f = o.mapTo(Foo.class, Map.of("bar_star","barStar","my_bool","myBool");
那么您将传入一个映射实例,这将告诉JsonObject如何映射字段?你能举个例子说明怎么做吗?我特别询问如何在反序列化到类之前映射字段。文档描述了如何将String
负载转换为POJO
,map
到POJO
和其他。查看ObjectMapper
中的readValue
和convertValue
方法
编辑命名约定只有一个问题
POJO
属性不适合JSON
。您需要在属性上使用SNAKE\u CASE
命名策略或JsonProperty
注释:
String json = "{\"bar_star\":\"yes\",\"my_bool\":true}";
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
JsonNode node = mapper.readTree(json);
System.out.println("Node: " + node);
System.out.println("Convert node to Foo: " + mapper.convertValue(node, Foo.class));
System.out.println("Deserialise JSON to Foo: " + mapper.readValue(json, Foo.class));
以上代码打印:
Node: {"bar_star":"yes","my_bool":true}
Convert node to Foo: Foo{barStar='yes', myBool=true}
Deserialise JSON to Foo: Foo{barStar='yes', myBool=true}
JsonProperty
您可以按如下方式使用:
@JsonProperty("bar_star")
public String barStar;
我创建了一个小应用程序来演示这一点。
要理解所有内容,最好只查看整个代码库。
请访问: 我正在发布一些代码,这是stackoverflow上通常需要的。
下面是
模型
基类和扩展它的类:
package de.thokari.epages.app.model;
import io.vertx.core.json.Json;
import io.vertx.core.json.JsonObject;
public abstract class Model {
public static <T extends Model> T fromJsonObject(JsonObject source, Class<T> clazz) {
return Json.decodeValue(source.encode(), clazz);
}
public JsonObject toJsonObject() {
return new JsonObject(Json.encode(this));
}
protected static <T> T validate(final String key, final T value) {
if (null == value) {
throw new IllegalArgumentException(key + " must not be null");
} else {
return (T) value;
}
}
public String toString() {
return Json.encode(this);
}
}
Vert.x有一个
mapTo
方法(请参阅)。当您已经有了一个JsonObject
时,它比建议的再次编码和解码的解决方案更有效
幕后Jackson用于映射,因此您只需使用@JsonProperty(“…”)
即可覆盖属性的映射
您的示例如下所示:
class Foo {
@JsonProperty("bar_start")
public String barStar;
@JsonProperty("my_bool")
public boolean myBool;
}
JsonObject obj = new JsonObject(`{"bar_star":"yes","my_bool":true}`);
Foo foo = obj.mapTo(Foo.class);
你能举个例子说明怎么做吗?它可以节省很多人的时间。在链接页面上,请查看
使用它部分(),其中包含您需要的内容。@cholo先生请查看我的答案,如果它符合您的目的,请向上投票。如前所述,您可能需要查看存储库。
class Foo {
@JsonProperty("bar_start")
public String barStar;
@JsonProperty("my_bool")
public boolean myBool;
}
JsonObject obj = new JsonObject(`{"bar_star":"yes","my_bool":true}`);
Foo foo = obj.mapTo(Foo.class);