Lombok/Jackson-用于json数组的POJO



我有一个json数组,需要从服务器接收(反序列化(并发送(序列化(到另一个服务器:

示例:

[
{
"car-name": "string",
"parts": [
"engine",
"wheels"
]
}
]

我开始编写以下POJO来表示这个Json数组:

import lombok.Builder;
import lombok.Singular;
import lombok.Value;

@Builder
@Value
public class Car {
private String carName;
@Singular("part")
private List<String> parts;
}

有了这个:

  1. 我可以使用Lombok构建对象,如下所示:

Car myCar = Car.builder().carName("Tesla").part("engine").part("wheels").build();

  1. 使用类似unmarshal().json(Jackson, Car.class)的东西进行解组

虽然1(和2(有效,但它们并没有给我提供真正代表上面json示例的对象。

他们给出的是:

{
"car-name": "string",
"parts": [
"engine",
"wheels"
]
}

我尝试使用如下的父类:

import lombok.Builder;
import lombok.Singular;
import lombok.Value;
@Builder
@Value
public class Vehicle {
private List<Car> vehicles;
}

但这也给了我一个错误的对象(注意"车辆"密钥与我在上面的例子中的密钥(:

{
"vehicles": {
"car-name": "string",
"parts": [
"engine",
"wheels"
]
}
}

如何编写表示此JSON数组的POJO,最好使用Lombok?还是杰克逊?

您不需要将List<Car>封装在Vehicle类中,因为Vehicle代表JsonObject,而vehicles是其中的一个属性。只需直接返回或序列化List<Car>

objectmapper.writeValueAsString(List<Car>);

你的问题与lombok无关,但我已经设法找到了问题的解决方法

创建自定义Serializer和SerializerModifier

汽车序列化程序

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
public class CarSerializer extends StdSerializer<Car> {
private JsonSerializer<Object> defaultSerializer = null;
public CarSerializer(JsonSerializer<Object> defaultSerializer) {
super(Car.class);
this.defaultSerializer = defaultSerializer;
}
public CarSerializer() {
super(Car.class);
}
@Override
public void serialize(Car value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeStartArray();
defaultSerializer.serialize(value, jgen, provider);
jgen.writeEndArray();
}
}

CarSerializerModifier

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
public class CarSerializerModifier extends BeanSerializerModifier {
@Override
public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
if (beanDesc.getBeanClass().equals(Car.class)) {
return new CarSerializer((JsonSerializer<Object>) serializer);
}
return serializer;
}
}

然后配置ObjectMapper使用CarSerializerModifier

Car myCar = Car.builder().carName("Tesla").part("engine").part("wheels").build();
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.setSerializerModifier(new CarSerializerModifier());
mapper.registerModule(module);
log.info(mapper.writeValueAsString(myCar));

你的车在这里阅读了更多关于我所做的事情。

如果您还想将ObjectMapper用于web请求和响应序列化,请阅读文章

只需将其添加到列表中

List<Car> carList=new ArrayList<>();
Car myCar = Car.builder().carName("Tesla").part("engine").part("wheels").build();
carList.add(myCar);

你会得到

[
{
"car-name": "string",
"parts": [
"engine",
"wheels"
]
}
]

最新更新