जैकलीन ऊंट-केस के पक्ष में अंडरस्कोर करती है


160

मैं इंटरनेट से JSON स्ट्रिंग पुनः प्राप्त करता हूं; अधिकांश JSON की तरह मैंने देखा है कि इसमें लंबी कुंजियाँ शामिल हैं जिन्हें अंडरस्कोर द्वारा अलग किया गया है। अनिवार्य रूप से, मेरा लक्ष्य JSON को जावा-ऑब्जेक्ट्स में डिसेर्बलाइज करना है, लेकिन मैं जावा-कोड में अंडरस्कोर का उपयोग नहीं करता हूं।

उदाहरण के लिए, मेरे पास ऊंट-मामले में फ़ील्ड के Userसाथ एक वर्ग हो सकता है firstName, साथ ही मुझे जैक्सन को first_nameजेन्सन से firstNameक्लास फ़ील्ड में मैप करने के लिए किसी तरह बताने की आवश्यकता है । क्या यह संभव है?

class User{
    protected String firstName;
    protected String getFirstName(){return firstName;}
}

जवाबों:


103

आपको @JsonPropertyउस फ़ील्ड पर उपयोग करना चाहिए जिसे आप डिफ़ॉल्ट नाम मैपिंग बदलना चाहते हैं।

class User{
    @JsonProperty("first_name")
    protected String firstName;
    protected String getFirstName(){return firstName;}
}

अधिक जानकारी के लिए: एपीआई


86
ऐसा न करें, वरना आपको इसे हर संपत्ति के लिए करना होगा। नीचे thehpi की प्रतिक्रिया देखें।
रयान शिलिंग्टन

मैं केवल एक संपत्ति का एनोटेट करने में सक्षम था, लेकिन इसने उत्पन्न स्ट्रिंग में गुणों के क्रम को बदल दिया: एनोटेट संपत्तियों को पिछले दिखाया गया। (जैक्सन २.३.०)
१en:

1
@RyanShillington - अगर मैं गलत हूं तो मुझे सुधारें, लेकिन यह आपका एकमात्र विकल्प है अगर आप जिस JSON स्ट्रिंग से पार्स कर रहे हैं वह सुसंगत प्रारूप का उपयोग नहीं करता है, अर्थात, कैमलकेस और अंडरस्कोर दोनों का उपयोग करता है?
डेविड आर.वी.

@DavidR यह सही है। मैं मान रहा हूँ कि आप स्रोत डेटा को ठीक नहीं कर सकते हैं? वह चूसता है।
रयान शिलिंग्टन

@PaulTsai ठीक है, इसलिए बेझिझक उनका उपयोग करें :)
एलेक्स

351

आप ObjectMapperऊंट मामले को एक अंडरस्कोर के साथ नामों में परिवर्तित करने के लिए कॉन्फ़िगर कर सकते हैं :

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

या इस एनोटेशन के साथ एक विशिष्ट मॉडल वर्ग एनोटेट करें:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

जैक्सन 2.7 से पहले, स्थिरांक नाम दिया गया था:

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

5
ध्यान दें कि यह केवल जैक्सन 1.9 में पेश किया गया था।
डेविड मोल्स

62
@deprecated 2.7 के बजाय SNAKE_CASE का उपयोग करें;
थर्मेक

1
एक qq: जब मैं स्नेक_केस नामकरण की रणनीति का उपयोग करता हूं तो क्या अंडरस्कोर वाली जोंस फाइलें कैमरून केस के लिए वांछनीय होंगी?
राम पात्रा

2
@ रामस्वरुप हाँ, इससे जैक्सन दोनों बोलते हैं और साँप की उम्मीद करते हैं
ड्रू स्टीफंस

1
@Ramswaroop मेरे लिए जैक्सन 2.7.3 के साथ और गुण केवल @JsonProperty(सामान्य camelCaseजावा गुणों से नामांकित नाम के साथ एनोटेट PropertyNamingStrategy.SNAKE_CASEकिए गए ) ने डेरासिलेशन को कैमलस जेन्सन के साथ काम करना बंद कर दिया (जैसा कि मैं उपयोग कर रहा था) और स्नेककेस की आवश्यकता होती है।
आकर्षित स्टीफंस

119

अगर इसका स्प्रिंग बूट एप्लिकेशन, इन एप्लिकेशन.प्रॉपीटीज़ फ़ाइल में, बस उपयोग करें

spring.jackson.property नामकरण-रणनीति = SNAKE_CASE

या इस एनोटेशन के साथ मॉडल वर्ग को एनोटेट करें।

@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)


3
अगर मैं अपनी कक्षा को "@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)" के साथ एनोटेट करता हूं तो यह काम करता है। लेकिन अगर मैं "application.properties" में "spring.jackson.property-naming-strategy = SNAKE_CASE" का उपयोग करता हूं तो यह नहीं होगा। मैं "स्प्रिंग बूट (v2.0.0.BUILD-SNAPSHOT)" का उपयोग कर रहा हूं। आपके पास कोई विचार है ?
ब्रूनो

1
यहाँ वही spring.jackson.property-naming-strategy=SNAKE_CASEकाम नहीं करता है, मैं स्प्रिंग बूट 2.0 का उपयोग कर रहा हूँ
सोलमैचिन

1
यहाँ पर, spring.jackson.property-naming-strategy = SNAKE_CASE काम नहीं करता है, मैं स्प्रिंग स्प्रिंग 2.0.5 का उपयोग कर रहा हूँ। लेकिन एनोटेशन का उपयोग मेरे लिए काम कर रहा है
नियो फाम

हो सकता है कि आपका ObjectMapperस्प्रिंग नहीं बनाया गया हो? एक @ विधि के साथ @Configuration क्लास बनाएँ जो एक ObjectMapper लौटाता है। निश्चित नहीं है कि यह आवश्यक है।
ओंद्र kaसुका

48

यदि आप एकल वर्ग के लिए यह चाहते हैं, तो आप @JsonNaming के साथ PropertyNamingStrategy का उपयोग कर सकते हैं , कुछ इस तरह है:

@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public static class Request {

    String businessName;
    String businessLegalName;

}

को क्रमबद्ध करेगा:

{
    "business_name" : "",
    "business_legal_name" : ""
}

चूंकि Jackson 2.7, के LowerCaseWithUnderscoresStrategyपक्ष में पदावनत किया गया था SnakeCaseStrategy, इसलिए आपको उपयोग करना चाहिए:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public static class Request {

    String businessName;
    String businessLegalName;

}

29

उपरोक्त उत्तर 100% सटीक हैं @JsonPropertyऔर CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORESहालांकि, कुछ लोग (मेरे जैसे) कोड आधारित कॉन्फ़िगरेशन के साथ स्प्रिंग एमवीसी एप्लिकेशन के अंदर ऐसा करने की कोशिश कर रहे हैं। Beans.javaवांछित प्रभाव प्राप्त करने के लिए यहां नमूना कोड (जो मेरे अंदर है ):

@Bean
public ObjectMapper jacksonObjectMapper() {
    return new ObjectMapper().setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
}

9
स्प्रिंग बूट का एक विकल्प, यदि आप application.propertiesऐड में स्प्रिंग बूट <= 1.3 का उपयोग कर रहे हैं spring.jackson.property-naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCOR‌​ES। इसके spring.jackson.property-naming-strategy=SNAKE_CASEबजाय स्प्रिंग बूट 1.4 का उपयोग करें ।
डंप केक

1
@zapl हाँ, आप सही हैं, मैंने संभवतः स्प्रिंग-बूट के संस्करण के बजाय जैकसन के संस्करण का उल्लेख किया है। मुझे भ्रम से बचने के लिए उस टिप्पणी को हटाने दें।
राम पात्रा

1
जैक्सन के संस्करण 2.7 के रूप में यह SNAKE_CASE है। इसने मेरे लिए काम किया: final ObjectMapper objectMapper = new ObjectMapper().setPropertyNamingStrategy( PropertyNamingStrategy.SNAKE_CASE);
जोनाथन

12

वर्तमान सबसे अच्छा अभ्यास जैक्सन को application.yml(या properties) फ़ाइल के भीतर कॉन्फ़िगर करना है ।

उदाहरण:

spring:
  jackson:
    property-naming-strategy: SNAKE_CASE

यदि आपके पास अधिक जटिल कॉन्फ़िगरेशन आवश्यकताएं हैं, तो आप जैक्सन को प्रोग्रामेटिक रूप से कॉन्फ़िगर भी कर सकते हैं।

import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
public class JacksonConfiguration {

    @Bean
    public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
        return new Jackson2ObjectMapperBuilder()
                .propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        // insert other configurations
    }

} 

क्या आप जानते हैं कि क्या आपके पास जैकसन 2objectmapper का एक और उदाहरण है जो इस एक को लोड और ओवरराइड कर रहा है? और क्या आप इस बात की पुष्टि कर सकते हैं कि यह बीन भी भरी हुई है?
केनी कैसन

साथ ही डफजे के घोल को एक चक्कर दें। यह बहुत समान है।
केनी कैसन

मुझे लगता है कि गुणों को ट्विक करना सही तरीका है; और भी सिफारिश की। जो इस तरह से करता है।
पश्चिमीगुण

@WesternGun अच्छी कॉल। मैं जब संभव हो yaml / गुणों के माध्यम से ऐसा करते हैं।
केनी कैसन

6

नीचे जैक्सन लाइब्रेरी के 2 अलग-अलग संस्करणों के लिए दोनों रणनीतियों का संकेत देते हुए यहां कुछ उत्तर दिए गए हैं:

जैक्सन 2.6 के लिए। *

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

जैक्सन 2.7 के लिए। *

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.SNAKE_CASE);

फिर से उन्होंने कुछ मूल्यों को हटा दिया, अब उनके पास KEBAB_CASE, yum है!
कल्पेश सोनी

FTR: कबाब-केस स्नेक_केस नहीं है ;-)
रेने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.