将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);