gpt4 book ai didi

java - 使用 JAX-RS 和 MOXy 进行 JSON 解码

转载 作者:太空宇宙 更新时间:2023-11-04 12:52:23 25 4
gpt4 key购买 nike

我正在使用 Jersey 2.22.1 和 MOXY 作为 Json 提供程序来实现 RESTFul Web 服务。

例如,我有以下实体用户:

public class User {

private String id;
private String email;
private Address address;
private List<Phone> phones;

// getters & setters

}

和其他类(class)

public class Address {

private String type;
private String value;

// getters & setters

}

public class Phone {

private String type;
private String value;

// getters & setters

}

这是我的 JAX-RS 资源实现:

@POST
public Response create(User user) {
// some logic
}

现在,当我发送包含以下 json 数据的 POST 请求时:

{
"id":"qwe12",
"email":"emailname@g-mail.com",
"address":{
"type":"1WHEN-Honorable",
"value":"1WHEN-M"
},
"phones":[
{
"type":"HOME",
"number":"034-2342-12-31"
},
{
"type":"WORK",
"number":"31-21-3211-32"
}
]
}

它工作得很好,MOXY 会自动将此 json 映射到用户对象,这很好

但是我需要用另一层嵌套来处理 json,如下所示:

{
"user":{
"id":"qwe12",
"email":"emailname@g-mail.com",
"address":{
"type":"1WHEN-Honorable",
"value":"1WHEN-M"
},
"phones":[
{
"type":"HOME",
"number":"034-2342-12-31"
},
{
"type":"WORK",
"number":"31-21-3211-32"
}
]
}
}

正如你所看到的,还有另一个名为 user 的键,我知道这不是一个好的 json 结构,但它是一个要求,我必须按原样接受它。现在我需要能够处理它。目前我只能看到一种解决方案。

我可以在 User 周围添加另一个类包装器并将其传递给 create 方法。

所以看起来是这样的:

JAX-RS 资源:

@POST
public Response create(UserWrapper user) {
// some logic
}

和java类:

public class UserWrapper {

private User user;

// getters & setters

}

这是可行的解决方案,但我不太喜欢它,因为我需要再添加一个额外的类。我想在这里提出您的建议,如何保持我的 java 类不变,并能够接受多一级嵌套的 json(我的意思是这个用户 key )。

提前致谢!

最佳答案

可能不是您正在寻找的答案,但我建议使用 Jackson 而不是 MOXy。它是一个更成熟的 JSON 框架,具有更多功能,而且性能更好。 MOXy 可能有一种方法,但这是 jackson 的方法

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.1</version>
</dependency>
<!-- You need to remember to remove MOXy -->

ContextResolver中,配置ObjectMapper以解开根值

@Provider
public class MyObjectMapperProvider implements ContextResolver<ObjectMapper> {
final ObjectMapper mapper;

public MyObjectMapperProvider() {
mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
}

@Override
public ObjectMapper getContext(Class<?> type) {
return defaultObjectMapper;
}
}

private static ObjectMapper createDefaultMapper() {
return mapper;
}
}

它将寻找反序列化的值是

  1. @JsonRootName 注释中的值,例如@JsonRootName("user")(在类上)
  2. @XmlRootElement 注释中的值,例如@XmlRootElment(name="user")(在类上)
  3. 如果没有注释,则为类的名称,首字母小写。

也不是,除非您正在使用任何 MOXy 特定功能,并切换到 Jackson,否则您可能根本不需要对您的类进行任何更改。 Jackson 还支持 JAXB 注释(大部分)。

如果您希望响应被包装,您也可以使用

mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);

关于java - 使用 JAX-RS 和 MOXy 进行 JSON 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35695836/

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