Gson เทียบเท่ากับ Jackson @JsonInclude(JsonInclude.Include.NON_NULL)

นี่เป็นการติดตามผลสำหรับคำถามนี้ สร้างคลาส DTO ขึ้นมาใหม่โดยไม่มีคุณสมบัติของฟิลด์ แทนที่จะกำหนดให้เป็นโมฆะโดยใช้ Gson/Jackson และ Spring Boot เดิมทีฉันโพสต์มันโดยพยายามทำให้มันใช้งานได้กับ Gson แต่สามารถทำได้กับ Jackson โดยใช้ @JsonInclude(JsonInclude.Include.NON_NULL) เท่านั้น แต่ยังไม่สามารถหาสิ่งที่เทียบเท่ากับ Gson ได้ ดังนั้นฉันจึงสามารถเก็บสิ่งนั้นไว้เป็นห้องสมุดสำหรับโครงการได้

ลองใช้ @Expose(serialise=false, deserialise=false) โดยที่ฉันมีคำอธิบายประกอบ @JsonInclude หรือตั้งค่าฟิลด์นั้นเป็นโมฆะเนื่องจากคิดว่า Gson โดยค่าเริ่มต้นจะเพิกเฉยต่อสิ่งนั้น แต่ดูเหมือนจะไม่ทำ

ในที่สุด ฉันพยายามลบคำอธิบายประกอบ @Expose ออกทั้งหมดเพื่อดูว่า Gson จะเพิกเฉยต่อสิ่งนั้น แต่ก็ไม่ได้ผลเช่นกัน

วางส่วนหลักๆ ของปัญหาไว้ที่นี่ พร้อมทั้งเก็บรายละเอียดเพิ่มเติมไว้ในโพสต์ต้นฉบับ

@Service
public class CategoryQueryServiceImpl implements CategoryQueryService {

@Autowired
private CategoryRepository categoryRepository;

@Autowired
private ReportRepository reportRepository;

ObjectMapper mapper = new ObjectMapper();

@Override
public CategoryQueryDto getCategory(UUID id) throws JsonProcessingException {

    if (categoryRepository.findById(id).isPresent()) {
        Category category = categoryRepository.findById(id).get();

        CategoryQueryDto categoryQueryDto = new CategoryQueryDto(category.getId(), category.getTitle());

          Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
          String converter = gson.toJson(categoryQueryDto);
          categoryQueryDto = gson.fromJson(converter, CategoryQueryDto.class);


        // Jackson
        //String converter = mapper.writeValueAsString(categoryQueryDto);

        //categoryQueryDto = mapper.readValue(converter, CategoryQueryDto.class);


        return categoryQueryDto;


    } else {
        return null;
    }

}


@AllArgsConstructor
@NoArgsConstructor
@Data
public class CategoryQueryDto {

@Expose()
private UUID id;
@Expose()
private String title;

// Jackson
// @JsonInclude(JsonInclude.Include.NON_NULL)
private List<ReportQueryDto> reports = null;

public CategoryQueryDto(UUID id, String title) {
    this.id = id;
    this.title = title;
}

}

หากใครมีแนวคิดอื่น ๆ เกี่ยวกับวิธีการทำเช่นนี้โปรด ขอบคุณมาก.


person Francislainy Campos    schedule 28.09.2020    source แหล่งที่มา


คำตอบ (2)


อย่าทำให้ฟิลด์ว่างเป็นอนุกรม (นี่เป็นพฤติกรรมเริ่มต้นของการทำให้เป็นอนุกรม Gson)

Employee employeeObj = new Employee(1, "John", "Smith", null);
                 
Gson gson = new GsonBuilder()
        .setPrettyPrinting()
        .create(); 
 
System.out.println(gson.toJson(employeeObj));

เอาท์พุท:

{
  "id": 1,
  "firstName": "John",
  "lastName": "Smith"
}

ทำให้ฟิลด์ว่างเป็นอนุกรม (การทำให้เป็นอนุกรม Gson แบบกำหนดเองด้วยค่า Null ที่รวมอยู่ในเอาต์พุต JSON)

Employee employeeObj = new Employee(1, "John", "Smith", null);
                 
Gson gson = new GsonBuilder()
        .setPrettyPrinting()
        .serializeNulls()
        .create(); 
 
System.out.println(gson.toJson(employeeObj));

เอาท์พุท:

{
  "id": 1,
  "firstName": "John",
  "lastName": "Smith",
  "emailId": null
}
person anurag saxena    schedule 28.09.2020
comment
สวัสดีขอบคุณสำหรับคำตอบ การโหวตว่ามีประโยชน์ในการพิจารณาว่าปัญหาคืออะไรเนื่องจากพฤติกรรมเริ่มต้นสำหรับ Gson ไม่ได้เกิดขึ้นและต้องแทนที่สิ่งนั้นภายในไฟล์ .properties - person Francislainy Campos; 29.09.2020

ดูเหมือนว่าพฤติกรรมเริ่มต้นสำหรับ Gson ไม่ได้เกิดขึ้นเนื่องจาก Spring Boot ใช้ Jackson เป็นไลบรารีการทำให้เป็นอนุกรมเริ่มต้น การเขียนทับสิ่งนี้โดยการวางบรรทัดด้านล่างภายในไฟล์ application.properties ได้แก้ไขปัญหาสำหรับฉันแล้ว

spring.mvc.converters.preferred-json-mapper=gson
person Francislainy Campos    schedule 29.09.2020