使用 JAX-RS 处理 JSON 响应
Processing JSON response using JAX-RS
I have a json payload like this:
{
"account": {
"sample_id": 1424876658095,
"parameters": [
{
"name": "email",
"value": "hello@xyz.com"
},
{
"name": "first_name",
"value": "FIRSTNAME"
},
{
"name": "last_name",
"value": "LASTNAME"
}
]
},
"assests": [ {
"tran_id": "1234567",
}]
}
上面的 json 负载是在 rest API 调用的响应中生成的。
我想在 java 中处理此响应以生成如下内容:
{
"account": {
"sample_id": 1424876658095,
"email_id": "hello@xyz.com",
"first_name": "FIRSTNAME",
"last_name": "LASTNAME",
},
"assets": [ {
"tran_id": "1234567",
}]
}
我正在使用 REST 的 JAX-RS 规范 API,但我找不到任何库来处理响应。
您必须为此实施自定义 MessageBodyWriter
才能为您的 POJO 生成不同于默认负载的 JSON 负载。
如果您想在 JAX-Rs 中利用 Jackson 序列化,您需要实现为自定义序列化程序。
有两个步骤可以做到这一点:
创建自定义序列化程序
这是一个基于 bean AccountBean
和 ParameterBean
的自定义 Jackson 序列化程序示例:
public class AccountBeanSerializer extends JsonSerializer<AccountBean> {
@Override
public void serialize(AccountBean accountBean, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("sample_id", accountBean.getSampleId());
List<ParameterBean> parameters = accountBean.getParameters();
for (ParameterBean parameterBean : parameters) {
jgen.writeStringField(parameterBean.getName(),
parameterBean.getValue());
}
jgen.writeEndObject();
}
}
我假设 class 是你的回应,如果是这样的话:
class ResponseBean
field account = class AccountBean
field sampleId (long)
field parameters = class ParameterBean
(...)
注册自定义序列化程序
然后您需要在上下文解析器中提供自定义 Jackson 配置。为此,您可以创建带有 Provider
.
注释的接口 ContextResolver
的实现
@Provider
public class CustomJacksonConfig implements ContextResolver<ObjectMapper> {
private ObjectMapper objectMapper;
public JacksonConfig() {
this.objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null));
module.addSerializer(AccountBean.class, new AccountSerializer());
this.objectMapper.registerModule(module);
}
public ObjectMapper getContext(Class<?> objectType) {
return objectMapper;
}
}
以下链接可以帮助您:
- http://www.baeldung.com/jackson-custom-serialization
- https://books.google.fr/books?id=cFBptKRXrk4C&pg=PA81&lpg=PA81&dq=jaxrs+ContextResolver&source=bl&ots=FlOzDeookf&sig=iY0dM8l5A0svwxB-hsfFO94eIqc&hl=fr&sa=X&ei=B5vwVKSmO8bbat2BguAB&ved=0CEkQ6AEwBQ#v=onepage&q=jaxrs%20ContextResolver&f=false
- https://github.com/FasterXML/jackson-jaxrs-json-provider
希望这对您有所帮助,
蒂埃里
I have a json payload like this:
{
"account": {
"sample_id": 1424876658095,
"parameters": [
{
"name": "email",
"value": "hello@xyz.com"
},
{
"name": "first_name",
"value": "FIRSTNAME"
},
{
"name": "last_name",
"value": "LASTNAME"
}
]
},
"assests": [ {
"tran_id": "1234567",
}]
}
上面的 json 负载是在 rest API 调用的响应中生成的。 我想在 java 中处理此响应以生成如下内容:
{
"account": {
"sample_id": 1424876658095,
"email_id": "hello@xyz.com",
"first_name": "FIRSTNAME",
"last_name": "LASTNAME",
},
"assets": [ {
"tran_id": "1234567",
}]
}
我正在使用 REST 的 JAX-RS 规范 API,但我找不到任何库来处理响应。
您必须为此实施自定义 MessageBodyWriter
才能为您的 POJO 生成不同于默认负载的 JSON 负载。
如果您想在 JAX-Rs 中利用 Jackson 序列化,您需要实现为自定义序列化程序。
有两个步骤可以做到这一点:
创建自定义序列化程序
这是一个基于 bean
AccountBean
和ParameterBean
的自定义 Jackson 序列化程序示例:public class AccountBeanSerializer extends JsonSerializer<AccountBean> { @Override public void serialize(AccountBean accountBean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeNumberField("sample_id", accountBean.getSampleId()); List<ParameterBean> parameters = accountBean.getParameters(); for (ParameterBean parameterBean : parameters) { jgen.writeStringField(parameterBean.getName(), parameterBean.getValue()); } jgen.writeEndObject(); } }
我假设 class 是你的回应,如果是这样的话:
class ResponseBean field account = class AccountBean field sampleId (long) field parameters = class ParameterBean (...)
注册自定义序列化程序
然后您需要在上下文解析器中提供自定义 Jackson 配置。为此,您可以创建带有
注释的接口Provider
.ContextResolver
的实现@Provider public class CustomJacksonConfig implements ContextResolver<ObjectMapper> { private ObjectMapper objectMapper; public JacksonConfig() { this.objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, null)); module.addSerializer(AccountBean.class, new AccountSerializer()); this.objectMapper.registerModule(module); } public ObjectMapper getContext(Class<?> objectType) { return objectMapper; } }
以下链接可以帮助您:
- http://www.baeldung.com/jackson-custom-serialization
- https://books.google.fr/books?id=cFBptKRXrk4C&pg=PA81&lpg=PA81&dq=jaxrs+ContextResolver&source=bl&ots=FlOzDeookf&sig=iY0dM8l5A0svwxB-hsfFO94eIqc&hl=fr&sa=X&ei=B5vwVKSmO8bbat2BguAB&ved=0CEkQ6AEwBQ#v=onepage&q=jaxrs%20ContextResolver&f=false
- https://github.com/FasterXML/jackson-jaxrs-json-provider
希望这对您有所帮助, 蒂埃里