जैक्सन @JsonInclude (JsonInclude.Include.NON_NULL) के बराबर Gson

Sep 28 2020

यह वास्तव में इस सवाल के लिए अनुवर्ती है कि क्षेत्र की संपत्ति के बिना डीटीओ वर्ग को फिर से बनाएं इसके बजाय गॉन / जैक्सन और स्प्रिंग बूट का उपयोग करके इसे शून्य कर दिया गया है । मैंने मूल रूप से इसे Gson के साथ काम करने की कोशिश करते हुए पोस्ट किया, लेकिन केवल जैक्सन के साथ इसे करने में सक्षम था, @JsonInclude(JsonInclude.Include.NON_NULL)लेकिन Gson के साथ इसके लिए एक समतुल्य नहीं मिला, इसलिए मैं इसे प्रोजेक्ट के लिए लाइब्रेरी के रूप में रख सकता हूं।

@Expose (serialise = false, deserialise = false) का उपयोग करके कोशिश की गई जहाँ मेरे पास @JsonInclude एनोटेशन था या उस फ़ील्ड को शून्य करने के लिए सेट किया गया था, जैसा कि डिफ़ॉल्ट रूप से 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;
}

}

अगर किसी को यह कैसे करना है पर कोई अन्य विचार है। आपका बहुत बहुत धन्यवाद।

जवाब

1 anuragsaxena Sep 28 2020 at 16:43

अशक्त क्षेत्रों को क्रमबद्ध न करें (यह गसन क्रमांकन का डिफ़ॉल्ट व्यवहार है)

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

अशक्त क्षेत्रों को क्रमबद्ध करें (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
}
FrancislainyCampos Sep 29 2020 at 03:27

ऐसा लगता है कि गॉन के लिए डिफ़ॉल्ट व्यवहार नहीं हो रहा था क्योंकि स्प्रिंग बूट जैक्सन को डिफ़ॉल्ट क्रमांकन पुस्तकालय के रूप में उपयोग करता है। application.propertiesफ़ाइल के भीतर नीचे की रेखा को चिपकाकर इसे ओवरराइट करने से मेरे लिए समस्या ठीक हो गई है।

spring.mvc.converters.preferred-json-mapper=gson