java - 使用 Lombok 将 JSON 数组映射到 POJO

标签 java json lombok

我看过类似的问题,但它似乎没有解决我的问题。 我有一个从 Feign Web 服务调用返回的 JSON 负载,我将其映射到 POJO。

JSON

{
   "fields":[
      {
        "field_one":"one value",
         "field_two":"two value",
      },
      {
         "field_one":"one value",
         "field_two":"two value",
      }
   ]
}

POJO - 包装类

@Data
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class FieldsResponse {

    public List<FieldInfo> fields;

}

POJO - 详细信息类

@Data
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class FieldInfo{

    @JsonProperty("field_one")
    private String fieldOne;

    @JsonProperty("field_two")
    private String fieldTwo;
}

POJO 尚未填充。如果我将包装器 POJO 中的项目更改为 JsonArray,一切都会正常工作(即:我可以正确看到 JSON 响应)。我尝试过初始化包装对象中的列表,并且还尝试过使用 vector 。

有什么想法吗?

预计到达时间:如果我删除 @JsonPropery("field_one") 映射并将变量从 fieldOne 重命名为 field_one 那么它就可以工作。但这不是我想要的工作方式。

最佳答案

下面的代码运行良好。

版本:

  • 采用OpenJDK 14
  • Eclipse:2020-03 (4.15.0)
  • junit:5.6.2
  • log4j2:2.13.3
  • jackson :2.11.0
  • Lombok :2012年1月18日
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import java.util.List;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.Data;
import lombok.extern.log4j.Log4j2;

@Log4j2
public class Q62195156 {

    // @formatter:off
    static final String JSON="{\"fields\":[{\"field_one\":\"one value\",\"field_two\":\"two value\"},{\"field_one\":\"one value\",\"field_two\":\"two value\"}]}";
    // @formatter:on


    static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    @Test
    void test() throws JsonMappingException, JsonProcessingException {

        var fieldsResponse = OBJECT_MAPPER.readValue(JSON, FieldsResponse.class);
        LOGGER.info("fieldResponse: {}", fieldsResponse);

        var fields = fieldsResponse.getFields();
        LOGGER.info("fields: {}", fieldsResponse);

        assertNotNull(fields, "fields");
        var fieldInfo0 = fields.get(0);
        LOGGER.info("fieldInfo0: {}", fieldInfo0);
        assertNotNull(fieldInfo0, "fieldInfo0");

        assertEquals(fieldInfo0.getFieldOne(), "one value", "fieldInfo0.getFieldOne()");
        assertEquals(fieldInfo0.getFieldTwo(), "two value", "fieldInfo0.getFieldTwo()");
        var fieldInfo1 = fields.get(1);
        LOGGER.info("fieldInfo1: {}", fieldInfo1);
        assertNotNull(fieldInfo1, "fieldInfo1");
        assertEquals(fieldInfo1.getFieldOne(), "one value", "fieldInfo1.getFieldOne()");
        assertEquals(fieldInfo1.getFieldTwo(), "two value", "fieldInfo1.getFieldTwo()");

    }

    @Data
    @JsonInclude(JsonInclude.Include.NON_NULL)
    static class FieldsResponse {

        public List<FieldInfo> fields;

    }

    @Data
    @JsonInclude(JsonInclude.Include.NON_NULL)
    static class FieldInfo {

        @JsonProperty("field_one")
        private String fieldOne;

        @JsonProperty("field_two")
        private String fieldTwo;
    }
}

结果:

13:14:42.344 [main] INFO  io.jeffmaxwell.stackoverflow.Q62195156 - fieldResponse: Q62195156.FieldsResponse(fields=[Q62195156.FieldInfo(fieldOne=one value, fieldTwo=two value), Q62195156.FieldInfo(fieldOne=one value, fieldTwo=two value)])
13:14:42.347 [main] INFO  io.jeffmaxwell.stackoverflow.Q62195156 - fields: Q62195156.FieldsResponse(fields=[Q62195156.FieldInfo(fieldOne=one value, fieldTwo=two value), Q62195156.FieldInfo(fieldOne=one value, fieldTwo=two value)])
13:14:42.349 [main] INFO  io.jeffmaxwell.stackoverflow.Q62195156 - fieldInfo0: Q62195156.FieldInfo(fieldOne=one value, fieldTwo=two value)
13:14:42.351 [main] INFO  io.jeffmaxwell.stackoverflow.Q62195156 - fieldInfo1: Q62195156.FieldInfo(fieldOne=one value, fieldTwo=two value)

关于java - 使用 Lombok 将 JSON 数组映射到 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62195156/

相关文章:

java - 提高java中Eratosthenes代码筛的效率

javascript - Ajax请求成功以json作为返回值不起作用

java - Lombok @NonNull 与 Validate.notNull

java - 如何将值传递给自定义注释?

java - 如何使用 Selenium 设置私有(private)代理?

ios - 使用 swift 4 进行 JSON 编码/解码

c# - 读取 JSON 在 asp.net c# 中动态创建的 header

java - Lombok在Intellij中的注解

java - 如何手动附加到响应数据包 lombok

java - 未找到 int 数组中的元素(虽然应该找到)