জেএসওএন শৈলীর বৈশিষ্ট্যগুলির নামকে জিএসওএন সহ জাভা ক্যামেলকেস নামগুলিতে রূপান্তর করুন


106

আমি একটি জাভা অবজেক্টে জেএসএন ডেটা রূপান্তর করতে জিএসএন ব্যবহার করছি । এটি আমার সমস্ত পরীক্ষায় বেশ ভাল কাজ করে। সমস্যাটি হ'ল আমাদের আসল বস্তুগুলিতে is_online এর মতো কিছু সম্পত্তি রয়েছে। GSON কেবলমাত্র তাদের মানচিত্র রাখে যদি তাদের সম্পূর্ণ সমান নাম দেওয়া হয়, GSON নামগুলি জাভা উট কেসনলাইন-তে রূপান্তর করা ভাল লাগবে।

JSON ডেটা তৈরি করার সময় এটি সম্ভব হয়েছে বলে মনে হয়, উটের কেসটি JSON এ আন্ডারস্কোর বিচ্ছিন্ন শব্দের রূপান্তরিত। তবে আমি অন্যভাবে এটি নির্দিষ্ট করার উপায় খুঁজে পাচ্ছি না।


5
আমি একটি উত্তর গ্রহণের প্রস্তাব দেব
JeanValjean

উত্তর:


313

আমি নিম্নোক্ত বৈশিষ্ট্য সহ জসন পড়ার সময় এবং আমার মডেলগুলিতে ক্যামেলসেস ব্যবহার করার সময় নীচের সেটিংসটি নিখুঁতভাবে কাজ করে দেখলাম।

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

2
দুর্দান্ত উত্তর, আপনাকে ধন্যবাদ! @ জানুজ্জ, যদি এই উত্তরগুলির কোনও একটি আপনাকে সহায়তা করে তবে দয়া করে এটিকে স্বীকৃত উত্তর হিসাবে চিহ্নিত করুন।
সুফিনওয়াজ

1
আপনার যদি এমন দুটি কেস থাকে যেখানে নামটিতে দুটি আন্ডারস্কোর থাকে তবে এটি প্রথম আন্ডারস্কোরটিকে উপেক্ষা করে। যাত্রা। এই_কি_হাস_উইউ_উইন্ডসোরসগুলি এই কেএহাস_ট_উইন্ডসরস্কোর এবং একই বিপরীতে রূপান্তরিত হবে। মূল বক্তব্য ফিল্ডনমিংপোলসি যেখানে এনামগুলি আন্ডারস্কোর সহ "লোয়ার কেস" বলে এবং এখানে রূপান্তরিত নামের আন্ডারস্কোর (_T) সহ একটি বড় হাতের অক্ষর রয়েছে।
দীপক জিএম

খুব সহজ, আমাকে একগুচ্ছ ক্ষেত্রের টীকা দেওয়া থেকে বাঁচায়!
উইলিয়াম টি। ম্যালার্ড

98

আপনি SerializedNameটীকাটি ব্যবহার করতে পারেন :

@SerializedName("field_name_in_json")
private final String fieldNameInJava;

দ্রষ্টব্য: আপনি যখন একটি FieldNamingPolicyইতিমধ্যে সেট করেছেন , SerializedNameনির্দিষ্ট ক্ষেত্রের জন্য এর সেটিংসটি ওভাররাইট করে দেবে (বিশেষ ক্ষেত্রে বেশ কার্যকর)।


2

আপনার উদাহরণ মনে রাখবেন একটি প্রান্ত মামলা। আপনার যদি কোনও সম্পত্তি 'ফু' থাকে তবে তার প্রাপকের নাম 'গেটফু' রাখা উচিত, এবং যদি আপনার 'foo_bar' নামে কোনও সম্পত্তি থাকে তবে তার প্রাপকের নাম 'getFooBar' রাখা উচিত, তবে, উদাহরণস্বরূপ আপনি বুলিয়ান ম্যাপিং করছেন এবং বুলিয়ান রয়েছে জাভা বিশেষ নামকরণের সম্মেলন। অনলাইন নামের একটি আদিম বুলিয়ান সম্পত্তির 'আইসঅনলাইন', একটি 'গেটঅনলাইন' বা আরও খারাপ, 'গেটইসঅনলাইন' নামক একটি গেটার থাকা উচিত। একটি বুলিয়ান র‍্যাপার অবজেক্ট (অর্থাত্ বুলিয়ান) এই বিশেষ কেসটি অনুসরণ করা উচিত নয় এবং 'অনলাইন' নামের একটি সম্পত্তির 'গেটঅনলাইন' নামক একটি গেটার থাকতে হবে।

সুতরাং, নামের সাথে 'হ'ল বুলিয়ান বৈশিষ্ট্য হ'ল একটি প্রান্তের কেস, যেখানে আপনি আপনার রূপান্তরকালে এই বিশেষ উপসর্গটি ছড়িয়ে দিতে চাইবেন। বিপরীত দিকে, আপনার কোড একটি কাঁচা সম্পত্তি নামের পাশাপাশি একটি 'is_XXX' সংস্করণ উভয়ের জন্য জসন অবজেক্টটি পরীক্ষা করতে চাইতে পারে।


2

আমার মনে হয় আপনি যা চান তা এখানেই আছে । টীকাগুলি ব্যবহার করে আপনি জিএসএনকে বলতে পারেন যে মাইসুপারকুলফিল্ডকে আসলে জাসনে এই_ফিল্ড_আইস_ফুন বলা হয় এবং এটি এটি সঠিকভাবে আনপ্যাক করবে। কমপক্ষে আমি মনে করি এটি deserialization এর জন্যও কাজ করে।

যদি এটি কাজ না করে তবে আপনি কাস্টম জসোনসিরাইজার / জসনডিজারিলাইজারগুলি ব্যবহার করতে পারেন, যা দুর্দান্ত কাজ করে তবে আপনার ক্লাসে পরিবর্তনের জন্য আপনাকে সেগুলি আপডেট করতে হবে (যেমন আপনি যখন ক্ষেত্র যুক্ত করবেন)। আপনি অটো-ম্যাজিক হারাবেন।

সবচেয়ে সহজ কাজটি (যা কুশ্রী হবে তবে খুব পরিষ্কার এবং সহজ যদি প্রথম পরামর্শটি কাজ না করে) হ'ল জিএসওনকে খুশি করার জন্য ক্ষেত্রটির নামকরণ করা এবং আপনার পছন্দ মতো নামের সাথে অতিরিক্ত এক্সেসরের পদ্ধতি যুক্ত করা হবে would , যেমন

public boolean isXXX() {return this.is_XXX;}

সহজ জিনিসটি আমি এই মুহুর্তে যা করছি এবং এটি ঠিক কাজ করে। সমস্ত কুরুচিপূর্ণ আদর্শ নয় জাভা স্টাইলযুক্ত কোড ডেটা ক্লাসগুলিতে লুকানো আছে এবং বাইরে থেকে কেউ এটি দেখতে পাবে না। তবে এটি এখনও আমাকে কিছুটা
কড়া নাড়ছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.