【问题标题】:Lombok/Jackson - POJO for a json arrayLombok/Jackson - 用于 json 数组的 POJO
【发布时间】:2020-06-04 06:26:27
【问题描述】:

我有一个 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?还是杰克逊?

【问题讨论】:

  • 可以显示序列化的代码吗?

标签: java arrays json jackson lombok


【解决方案1】:

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

objectmapper.writeValueAsString(List<Car>);

【讨论】:

    【解决方案2】:

    您的问题与 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));
    

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

    如果您还想将 ObjectMapper 用于您的 Web 请求和响应序列化,请阅读 article

    【讨论】:

      【解决方案3】:

      只需将其添加到列表中

      喜欢

      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"
          ]
        }
      ]
      

      【讨论】:

        猜你喜欢
        • 2020-09-23
        • 2019-08-10
        • 2016-10-02
        • 1970-01-01
        • 2018-07-22
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多