জ্যাকসন উটের মামলার পক্ষে আন্ডারস্কোর করেছেন


160

আমি ইন্টারনেট থেকে একটি জেএসএন স্ট্রিং পুনরুদ্ধার করি; বেশিরভাগ 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
এটি করবেন না, অন্যথায় আপনাকে প্রতিটি সম্পত্তির জন্য এটি করতে হবে। নীচে থিপি এর প্রতিক্রিয়া দেখুন।
রায়ান শিলিংটন

আমি কেবল একটি সম্পত্তি বর্ণনা করতে সক্ষম হয়েছি, তবে এটি উত্পন্ন স্ট্রিংয়ের বৈশিষ্ট্যগুলির ক্রম পরিবর্তন করেছে: টীকাগত বৈশিষ্ট্যগুলি সর্বশেষে প্রদর্শিত হয়েছিল। (জ্যাকসন
২.৩.০

1
@ রায়ানশিলিংটন - আমি ভুল হলে আমাকে সংশোধন করুন, তবে আপনি যে JSON স্ট্রিংটি পার্স করছেন সেটি যদি একটি সামঞ্জস্যপূর্ণ ফর্ম্যাট ব্যবহার না করে, যেমন, উট কেস এবং আন্ডারস্কোর উভয়ই ব্যবহার করে তবে এটি আপনার একমাত্র বিকল্প?
ডেভিডআর

@ ডেভিডআর এটি সঠিক। আমি ধরে নিচ্ছি আপনি সোর্স ডেটা ঠিক করতে পারবেন না? যে স্তন্যপান।
রায়ান শিলিংটন

@PaulTsai ঠিক আছে, তাই তাদের ব্যবহার করার জন্য বিনামূল্যে :) মনে
অ্যালেক্স

351

আপনি ObjectMapperএকটি আন্ডারস্কোর সহ উটের কেসকে নামগুলিতে রূপান্তর করতে কনফিগার করতে পারেন :

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

অথবা এই টিকাটি সহ একটি নির্দিষ্ট মডেল শ্রেণিকে টীকায়িত করুন:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

জ্যাকসন ২.7 এর আগে ধ্রুবকের নাম দেওয়া হয়েছিল:

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

5
নোট করুন যে এটি কেবল জ্যাকসন ১.৯-এ চালু হয়েছিল।
ডেভিড মোলস

62
@ অনুগ্রহপূর্বক 2.7 এর পরিবর্তে SNAKE_CASE ব্যবহার করুন;
থার্মেক

1
এক কিউকিউ: আমি যখন স্নাপকেস নামকরণের কৌশলটি ব্যবহার করি তখন কি আন্ডারস্কোর সহ জসন ফাইলগুলি উটের ক্ষেত্রে বিশৃঙ্খলাবদ্ধ হবে?
রাম পাত্র

2
@ রামস্বরূপ হ্যাঁ, এটি জ্যাকসন দুজনকেই সাপ_কে কথা বলতে এবং প্রত্যাশা করে
ড্রিউ স্টিফেনস

1
@ রামস্বরূপ আমার কাছে জ্যাকসন ২.7.৩ সহ এবং কেবলমাত্র @JsonProperty(সাধারণ camelCaseজাভা সম্পত্তি থেকে অনুমান করা নাম ) দ্বারা বর্ণিত বৈশিষ্ট্যগুলি PropertyNamingStrategy.SNAKE_CASEউটের কেস জেএসএন (যেমন আমি ব্যবহার করছিলাম) এর সাথে কাজ করা বন্ধ করে দিয়েছিল এবং সর্পকেস লাগিয়েছে।
ড্র স্টিফেনস

119

যদি এটি একটি স্প্রিং বুট অ্যাপ্লিকেশন, অ্যাপ্লিকেশন.প্রোপার্টি ফাইলগুলিতে, কেবল ব্যবহার করুন

spring.jackson.property নামকরণ করার-কৌশল = SNAKE_CASE

অথবা এই টিকাটি দিয়ে মডেল ক্লাসটি টিকে দিন।

@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)


3
যদি আমি "@ জসননামিং (প্রপার্টিনামিংস্ট্রেটজি। স্নেককেস স্ট্রেট্যাগি.ক্লাস)" দিয়ে আমার ক্লাসটি টিকিয়ে রাখি তবে এটি কাজ করে। তবে আমি যদি "অ্যাপ্লিকেশন.প্রোপার্টি" তে "বসন্ত.জ্যাকসন.প্রোপার্টি-নামকরণ-কৌশল = SNAKE_CASE" ব্যবহার করি তবে তা হবে না। আমি "স্প্রিং বুট (v2.0.0. বিল্ড- SNAPSHOT)" ব্যবহার করছি। তোমার কোন ধারনা আছে ?
ব্রুনো

1
এখানে একই, spring.jackson.property-naming-strategy=SNAKE_CASEকাজ করে না, আমি স্প্রিং বুট ২.০ ব্যবহার করছি
০১:৪৪ এ আত্মাচারনা

1
এখানে একই, বসন্ত.jackson.property-नामকরণ-কৌশল = SNAKE_CASE কাজ করে না, আমি স্প্রিং বুট 2.0.5 ব্যবহার করছি। তবে টীকাটি ব্যবহার করা আমার পক্ষে কাজ করছে
নব্য ফ্যাম

সম্ভবত আপনার ObjectMapperবসন্ত দ্বারা নির্মিত হয় না? @ বিয়ান পদ্ধতিতে একটি @ কনফিগারেশন ক্লাস তৈরি করুন যা কোনও অবজেক্টম্যাপারকে ফেরত দেয়। এটি প্রয়োজনীয় কিনা তা নিশ্চিত নয়।
ওন্দ্রা Žižka

48

আপনি যদি এটি একটি একক শ্রেণীর জন্য চান তবে আপনি @ জসননমিংয়ের সাথে সম্পত্তি - নামকরণ স্ট্র্যাটেজি ব্যবহার করতে পারেন , এরকম কিছু:

@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

উপরোক্ত উত্তরগুলি সম্পর্কিত @JsonPropertyএবং CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES100% নির্ভুল, যদিও কিছু লোক (আমার মতো) সম্ভবত কোড-ভিত্তিক কনফিগারেশন সহ একটি স্প্রিং এমভিসি অ্যাপ্লিকেশনটিতে এটি করার চেষ্টা করছে। Beans.javaপছন্দসই প্রভাব অর্জনের জন্য এখানে নমুনা কোড (যা আমার ভিতরে রয়েছে ):

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

9
স্প্রিং বুট একটা বিকল্প, আপনাকে স্প্রিং বুট <= 1.3 ব্যবহার করছি application.propertiesঅ্যাড spring.jackson.property-naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCOR‌​ESspring.jackson.property-naming-strategy=SNAKE_CASEপরিবর্তে স্প্রিং বুটের জন্য 1.4 ব্যবহার করুন।
ডাম্প কেক

1
@ জ্যাপল হ্যাঁ আপনি ঠিক বলেছেন, আমি সম্ভবত বসন্ত-বুটের সংস্করণের পরিবর্তে জ্যাকসনের সংস্করণ উল্লেখ করেছি। বিভ্রান্তি এড়াতে আমাকে সেই মন্তব্যটি মুছে ফেলুন।
রাম পাত্র

1
জ্যাকসনের ২.7 সংস্করণ হিসাবে এটি হ'ল এসএনএক_সিএএসইএস। এটি আমার জন্য কাজ করেছে: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
    }

} 

আপনি যদি জানেন যে আপনার কাছে জ্যাকসন টোবজেক্টম্যাপারটি লোড হওয়ার এবং এটিকে ওভাররাইড করার আরেকটি উদাহরণ রয়েছে? এবং আপনি কি নিশ্চিত করতে পারেন যে এই শিমটিও বোঝা হচ্ছে?
কেনি সিজন

ডাফজে'র সমাধানটিকে ঘূর্ণি দেয়। এটি বেশ অনুরূপ।
কেনি কেসন

আমি মনে করি সম্পত্তিগুলি টুইট করা সঠিক উপায়; এবং প্রস্তাবিত, খুব। এটি এই হিসাবে একই করে।
ওয়েস্টার্নগুন

@ ওয়েস্টার্নগান ভাল কল আমি যখন সম্ভব সম্ভব ইয়ামল / বৈশিষ্ট্যগুলির মাধ্যমে এটি করার ঝোঁক করি।
কেনি কেসন

6

এখানে কয়েকটি উত্তর নীচে জ্যাকসন লাইব্রেরির 2 টি বিভিন্ন সংস্করণের জন্য উভয় কৌশলকেই ইঙ্গিত করে:

জ্যাকসন ২.6 এর জন্য *

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

জ্যাকসন ২.7 এর জন্য। *

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

আবার তারা কিছু মান অবমূল্যায়ন করেছে, এখন তাদের KEBAB_CASE আছে, হ্যাঁ!
কল্পনা সনি

এফটিআর: কাবাব-কেস সাপ_কেস নয় ;-)
রেনে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.