কীভাবে একটি জাভা অবজেক্ট (বিন) কে কী-মান জোড় (এবং বিপরীতে) রূপান্তর করবেন?


93

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

এই রূপান্তরটি করার জন্য প্রতিবিম্ব বা ম্যানুয়ালি কোড লেখার ব্যতীত, এটি অর্জনের সর্বোত্তম উপায় কোনটি?

অবজেক্টমেসেজ প্রকারটি ব্যবহার না করে (বা আগত বার্তাকে সঠিক ধরণের অবজেক্টে রূপান্তর করা) একটি উদাহরণ জেএমএসের মাধ্যমে এই বস্তুকে প্রেরণ করা হতে পারে।


java.beans.Introspector.getBeanInfo()। এটি ঠিক জেডিকে-তে নির্মিত।
ব্যবহারকারী 207421

উত্তর:


53

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


8
তদ্ব্যতীত, হুডের নীচে প্রতিবিম্ব ব্যবহার করা সম্পর্কে কোনও ভুল নেই। বিশেষত যদি ফলাফলগুলি ক্যাশে করা হয় (ভবিষ্যতের ব্যবহারের জন্য), প্রতিবিম্ব-ভিত্তিক অ্যাক্সেস সাধারণত বেশিরভাগ ব্যবহারের ক্ষেত্রে যথেষ্ট দ্রুত হয়।
স্টেক্সম্যান

22
সুনির্দিষ্টভাবে বলতে গেলে, বিয়ানম্যাপ (শিম) হ'ল সাধারণ বিয়ান্টিলের নির্দিষ্ট অংশ যা কৌশলটি করে।
ভিডিআর

4
পারফরম্যান্স বিবেচনার বিষয়টি উপেক্ষা করে আমি দেখতে পেয়েছি যে নীচের উত্তর থেকে জ্যাকসনের অবজেক্টম্যাপারের সংমিশ্রণে বিয়ানম্যাপ () ব্যবহার করা আমাকে সেরা ফলাফল দিয়েছে। বিয়ানম্যাপ আমার অবজেক্টের আরও সম্পূর্ণ মানচিত্র তৈরি করতে সফল হয়েছিল এবং তারপরে জ্যাকসন এটিকে প্লেইন লিংকডহ্যাশম্যাপ কাঠামোতে রূপান্তরিত করে যা পাইপলাইনের নিচে আরও পরিবর্তন আনতে দেয়। অবজেক্টএসম্যাপ = অবজেক্টম্যাপারকনভার্টভ্যালু (নতুন বিয়ানম্যাপ (মাইবজেক্ট), ম্যাপক্লাস);
michaelr524

অ্যান্ড্রয়েডে কাজ করবে না কারণ এটি java.beansপ্ল্যাটফর্মে মারাত্মকভাবে সীমাবদ্ধ নির্ভরতা ব্যবহার করে। বিশদ সম্পর্কিত সম্পর্কিত প্রশ্নটি দেখুন ।
স্কিজিমো

অ্যাপাচি কমন্স সম্পর্কিত একটি সমাধান বেশিরভাগ সময় সেরা সমাধান।
4

179

প্রচুর সম্ভাব্য সমাধান, তবে আসুন আমরা আরও একটি যুক্ত করি। "জেসন-কম" রূপান্তর করতে জ্যাকসন (জেএসএন প্রসেসিং লিব) ব্যবহার করুন , যেমন:

ObjectMapper m = new ObjectMapper();
Map<String,Object> props = m.convertValue(myBean, Map.class);
MyBean anotherBean = m.convertValue(props, MyBean.class);

( এই ব্লগ এন্ট্রি আরও কিছু উদাহরণ আছে)

আপনি মূলত যে কোনও সামঞ্জস্যপূর্ণ ধরণের রূপান্তর করতে পারেন: সামঞ্জস্যপূর্ণ অর্থ আপনি যদি টাইপ থেকে জেএসওনে রূপান্তর করেন এবং সেই জেএসওএন থেকে ফলাফলের ধরণে প্রবেশগুলি মিলবে (যদি সঠিকভাবে কনফিগার করা থাকে তবে কেবল অজ্ঞাতগুলিকেও উপেক্ষা করা যেতে পারে)।

মানচিত্র, তালিকাগুলি, অ্যারে, আদিম, শিমের মতো POJO সহ যেসব ক্ষেত্রে প্রত্যাশা থাকে তার ক্ষেত্রে ভাল কাজ করে।


4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। BeanUtilsদুর্দান্ত, তবে অ্যারে এবং এনামগুলিকে পরিচালনা করতে পারে না
মণীশ প্যাটেল

8

কোড জেনারেশনটি আমি ভাবতে পারি এমন একমাত্র উপায়। ব্যক্তিগতভাবে, আমি একটি সাধারণ পুনরায় ব্যবহারযোগ্য প্রতিবিম্ব সমাধান পেয়েছি (কোডের যে অংশটি একেবারে পারফরম্যান্স-সমালোচনা না করে)। জেএমএস ব্যবহার করা ওভারকিলের মতো শোনাচ্ছে (অতিরিক্ত নির্ভরতা, এবং এটি এর অর্থ কী তা নয়)। তদাতিরিক্ত, এটি সম্ভবত হুডের নীচে প্রতিচ্ছবিও ব্যবহার করে।


পারফরম্যান্স সমালোচিত তাই আমার মনে হয় প্রতিফলন শেষ। আমি আশা করছিলাম যে এমন কিছু সরঞ্জাম থাকতে পারে যা asm বা cglib ব্যবহার করে। আমি আবার গুগলের প্রোটোকল বাফারগুলির দিকে তাকাতে শুরু করেছি। আমি জেএমএস সম্পর্কে আপনার মন্তব্য পাইনি, আমি এটি মেশিনগুলিতে তথ্য যোগাযোগের জন্য ব্যবহার করছি।
শাহবাজ 19

আমি এটা ভুল বুঝেছি। পারফরম্যান্সের ক্ষেত্রে পারফরম্যান্স গুরুত্বপূর্ণ হওয়া এবং সেই নির্দিষ্ট অংশটি পারফরম্যান্স-সমালোচনার মধ্যে পার্থক্য রয়েছে। অ্যাপ্লিকেশনটি কী করছে তার তুলনায় এটি কতটা গুরুত্বপূর্ণ তা দেখার জন্য আমি একটি বেঞ্চমার্ক করব।
মাইকেল বর্গওয়ার্ট

এটাই আমার চিন্তাভাবনা। হয় আপনি প্রতিবিম্ব ব্যবহার করেন (প্রত্যক্ষ বা পরোক্ষভাবে) অথবা আপনার কোড তৈরি করতে হবে। (অথবা অতিরিক্ত কোডটি নিজে লিখুন)।
এক্সারেনন

8

এটি জাভা অবজেক্টকে মানচিত্রে রূপান্তর করার জন্য একটি পদ্ধতি

public static Map<String, Object> ConvertObjectToMap(Object obj) throws 
    IllegalAccessException, 
    IllegalArgumentException, 
    InvocationTargetException {
        Class<?> pomclass = obj.getClass();
        pomclass = obj.getClass();
        Method[] methods = obj.getClass().getMethods();


        Map<String, Object> map = new HashMap<String, Object>();
        for (Method m : methods) {
           if (m.getName().startsWith("get") && !m.getName().startsWith("getClass")) {
              Object value = (Object) m.invoke(obj);
              map.put(m.getName().substring(3), (Object) value);
           }
        }
    return map;
}

এভাবেই ডাকতে হবে

   Test test = new Test()
   Map<String, Object> map = ConvertObjectToMap(test);

4
আমি মনে করি না যে প্রতিটি বস্তুর উপর নির্ধারিত পদ্ধতিগুলির মধ্যে কাঙ্ক্ষিত উত্তরটি পুনরাবৃত্তি হবে, প্রতিচ্ছবির মতো শোনাচ্ছে।
রবার্ট কার্ল

4
আমি জানি না যে আপনার উদ্দেশ্যগুলি আপনার পদ্ধতি। তবে আমি মনে করি এটি জেনেরিক ধরণের অবজেক্টের সাথে প্রোগ্রামিং করতে চাইলে এটি খুব দুর্দান্ত উদাহরণ
DeXoN

6

সম্ভবত পার্টিতে দেরি হয়েছে। আপনি জ্যাকসন ব্যবহার করতে পারেন এবং এটিকে কোনও প্রোপার্টি অবজেক্টে রূপান্তর করতে পারেন। এটি নেস্টেড ক্লাসগুলির জন্য উপযুক্ত এবং যদি আপনি abc = মানের জন্য কীটি চান want

JavaPropsMapper mapper = new JavaPropsMapper();
Properties properties = mapper.writeValueAsProperties(sct);
Map<Object, Object> map = properties;

যদি আপনি কিছু প্রত্যয় চান, তবে ঠিক করুন

SerializationConfig config = mapper.getSerializationConfig()
                .withRootName("suffix");
mapper.setConfig(config);

এই নির্ভরতা যুক্ত করা প্রয়োজন

<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-properties</artifactId>
</dependency>

4

জাভা 8 এর সাথে আপনি এটি ব্যবহার করতে পারেন:

public Map<String, Object> toKeyValuePairs(Object instance) {
    return Arrays.stream(Bean.class.getDeclaredMethods())
            .collect(Collectors.toMap(
                    Method::getName,
                    m -> {
                        try {
                            Object result = m.invoke(instance);
                            return result != null ? result : "";
                        } catch (Exception e) {
                            return "";
                        }
                    }));
}

3

জেএসওএন , উদাহরণস্বরূপ এক্সস্ট্রিম + জেটিসন ব্যবহার করে মূল মান জোড় সহ একটি সাধারণ পাঠ্য বিন্যাস। এটি অন্য প্ল্যাটফর্ম / ভাষাগুলির সাথে জাভা অবজেক্ট এক্সচেঞ্জের জন্য অ্যাপাচি অ্যাক্টিভিএম জেএমএস বার্তা ব্রোকার দ্বারা সমর্থিত।


3

কেবল প্রতিচ্ছবি এবং গ্রোভির ব্যবহার:

def Map toMap(object) {             
return object?.properties.findAll{ (it.key != 'class') }.collectEntries {
            it.value == null || it.value instanceof Serializable ? [it.key, it.value] : [it.key,   toMap(it.value)]
    }   
}

def toObject(map, obj) {        
    map.each {
        def field = obj.class.getDeclaredField(it.key)
        if (it.value != null) {
            if (field.getType().equals(it.value.class)){
                obj."$it.key" = it.value
            }else if (it.value instanceof Map){
                def objectFieldValue = obj."$it.key"
                def fieldValue = (objectFieldValue == null) ? field.getType().newInstance() : objectFieldValue
                obj."$it.key" = toObject(it.value,fieldValue) 
            }
        }
    }
    return obj;
}

দুর্দান্ত তবে স্ট্যাকওভারফ্লো এরিয়ার প্রবণ
টিও চুং পিং

3

জাফ্রো-রিফ্লেক্টের বিয়ান র্যাপার ব্যবহার করুন । এটা খুব পারফরম্যান্ট।

এখানে আপনি কীভাবে বিনকে মানচিত্রে রূপান্তর করতে পারেন:

public static Map<String, Object> getBeanMap(Object bean) {
    Map<String, Object> beanMap = new HashMap<String, Object>();
    BeanWrapper beanWrapper = new BeanWrapper(BeanWrapperContext.create(bean.getClass()));
    for(String propertyName : beanWrapper.getPropertyNames())
        beanMap.put(propertyName, beanWrapper.getValue(propertyName));
    return beanMap;
}

আমি নিজেই জাফ্রুকে বিকাশ করেছি। এটি ওপেন সোর্স, সুতরাং আপনি এটি ব্যবহার এবং পরিবর্তন করতে মুক্ত free এবং যদি আপনার এ সম্পর্কে কোনও প্রশ্ন থাকে তবে আমি প্রতিক্রিয়া জানাতে খুশি হব।

চিয়ার্স

কার্লোস


আমি এটি সম্পর্কে ভেবেছিলাম এবং বুঝতে পেরেছিলাম যে আপনার বীন গ্রাফে বিজ্ঞপ্তি সংক্রান্ত রেফারেন্স থাকলে আমার আগের সমাধানটি ভেঙে যায়। সুতরাং আমি একটি পদ্ধতি তৈরি করেছি যা স্বচ্ছভাবে এটি করবে এবং বিজ্ঞপ্তিগুলি খুব সুন্দরভাবে পরিচালনা করবে। আপনি এখন একটি বিনকে মানচিত্রে রূপান্তর করতে পারেন এবং জাফ্রো-প্রতিবিম্বের সাথে তদ্বিপরীত। উপভোগ করুন :)
মার্টিনস

3

স্প্রিং ব্যবহার করার সময়, কেউ স্প্রিং ইন্টিগ্রেশন অবজেক্ট-টু-ম্যাপ-ট্রান্সফর্মারও ব্যবহার করতে পারে। কেবল এটির জন্য নির্ভরতা হিসাবে স্প্রিং যুক্ত করার উপযুক্ত নয় not

ডকুমেন্টেশনের জন্য, http://docs.spring.io/spring-integration/docs/4.0.4- এ "অবজেক্ট টু ম্যাপ ট্রান্সফর্মার" অনুসন্ধান করুন RE

মূলত, এটি ইনপুট হিসাবে প্রদত্ত বস্তুটি থেকে অ্যাক্সেসযোগ্য পুরো অবজেক্টের গ্রাফটি অতিক্রম করে এবং বস্তুগুলিতে সমস্ত আদিম ধরণের / স্ট্রিং ক্ষেত্র থেকে একটি মানচিত্র তৈরি করে। এটি হয় আউটপুট কনফিগার করা যেতে পারে:

  • একটি সমতল মানচিত্র: {রুটবজেক্ট.সোমফিল্ড = জো, রুটঅবজেক্ট.এলএফওজেক্ট.সোমফিল্ড = জেন or, বা
  • একটি কাঠামোগত মানচিত্র: {কিছুফিল্ড = জো, পাতাগুলি = {কিছু ফিল্ড = জেন}}}

এখানে তাদের পৃষ্ঠা থেকে একটি উদাহরণ:

public class Parent{
    private Child child;
    private String name; 
    // setters and getters are omitted
}

public class Child{
   private String name; 
   private List<String> nickNames;
   // setters and getters are omitted
}

আউটপুট হবে:

। person.name = জর্জি, person.child.name = জেনা, person.child.nickNames [0] = বিম্বো। । । ইত্যাদি}

একটি বিপরীত ট্রান্সফর্মারও উপলব্ধ।


2

আপনি জোদা ফ্রেমওয়ার্ক ব্যবহার করতে পারেন:

http://joda.sourceforge.net/

এবং JodaProperties এর সুবিধা নিন। এটি নির্দিষ্ট করে যে আপনি কোনও নির্দিষ্ট উপায়ে মটরশুটি তৈরি করেন এবং একটি নির্দিষ্ট ইন্টারফেস প্রয়োগ করেন। তবে এটি আপনাকে প্রতিফলন ছাড়াই নির্দিষ্ট শ্রেণি থেকে সম্পত্তি মানচিত্র ফেরত দেওয়ার অনুমতি দেয়। নমুনা কোড এখানে:

http://pbin.oogly.co.uk/listings/ ভিউলিস্টিংডেটেল/0e78eb6c76d071b4e22bbcac748c57


আকর্ষণীয় দেখায়, দুর্ভাগ্যক্রমে এটি দেখে মনে হয় না এটি আর রক্ষণাবেক্ষণ করা হয়। তদুপরি, যে বৈশিষ্ট্যের মানচিত্র এটি প্রত্যাবর্তন করে তা হ'ল <স্ট্রিং, স্ট্রিং> এর মানচিত্র, তাই নিরাপদ টাইপ না করে।
শাহবাজ

4
সত্য, এটি ২০০২ সাল থেকে রক্ষণাবেক্ষণ করা হয়নি। একটি প্রতিবিম্বিত ভিত্তিক সমাধানের অস্তিত্ব আছে কিনা তা নিয়ে আমি কেবল কৌতূহলী ছিলাম। যে মানচিত্রটি এটি প্রত্যাবর্তন করে তা আসলে কেবল একটি মানচিত্র, এর মতো জেনারিকস নেই ...
জন

2

আপনি যদি প্রতিটি গেটর এবং সেটারকে হার্ডকোড কল করতে না চান তবে প্রতিবিম্ব এই পদ্ধতিগুলি কল করার একমাত্র উপায় (তবে এটি শক্ত নয়)।

প্রকৃত ডেটা ধরে রাখতে কোনও প্রোপার্টি অবজেক্ট ব্যবহার করার জন্য আপনি কি ক্লাসের প্রশ্নের পুনরুদ্ধার করতে পারেন এবং প্রতিটি গেটার এবং সেটারকে কেবল কল করতে দেওয়া / সেট করতে দেওয়া উচিত? তারপরে আপনি যা করতে চান তার জন্য আপনার একটি কাঠামো ভালভাবে উপযুক্ত। কী-মান ফর্মটি এগুলি সংরক্ষণ এবং লোড করার জন্য এমনকি পদ্ধতি রয়েছে।


কোনও পদ্ধতি নেই, কারণ এটি আপনার উপর নির্ভর করে কী কী এবং কোনটি মূল্য! এমন কোনও রূপান্তর যা এমন কোনও পরিষেবা লিখতে সহজ হওয়া উচিত। সাধারণ উপস্থাপনের জন্য সিএসভি গ্রহণযোগ্য হতে পারে।
মার্টিন কে।

2

ডোজার ব্যবহার করা সবচেয়ে ভাল সমাধান। ম্যাপার ফাইলে আপনার এই জাতীয় কিছু দরকার:

<mapping map-id="myTestMapping">
  <class-a>org.dozer.vo.map.SomeComplexType</class-a>
  <class-b>java.util.Map</class-b>
</mapping> 

এবং এটিই, ডোজার বাকী সমস্ত লোকদের যত্ন নেয় !!!

ডোজার ডকুমেন্টেশন ইউআরএল


এটি কেন ম্যাপিং ফাইলের প্রয়োজন? যদি এটি কীভাবে রূপান্তর করতে হয়, তবে কেন এই অতিরিক্ত কাজের প্রয়োজন - কেবল উত্স অবজেক্ট, প্রত্যাশিত প্রকারটি নিন?
স্ট্যাকসমান

ঠিক আছে. এটি সঠিক কিনা তা নিশ্চিত হওয়ার পরেও কারণটি জানা ভাল :) :)
StaxMan

2

রূপান্তরকরণের নিখুঁত সহজ উপায় অবশ্যই আছে - কোনও রূপান্তর নেই!

ক্লাসে সংজ্ঞায়িত ব্যক্তিগত ভেরিয়েবলগুলি ব্যবহার না করে ক্লাসে কেবলমাত্র একটি হ্যাশম্যাপ থাকে যা উদাহরণের জন্য মানগুলি সংরক্ষণ করে।

তারপরে আপনার গেটার্স এবং সেটটারগুলি ফিরে আসবে এবং হ্যাশম্যাপে এবং এর বাইরে মান নির্ধারণ করবে এবং যখন এটি মানচিত্রে রূপান্তর করার সময় হবে, ভয়েলা! - এটি ইতিমধ্যে একটি মানচিত্র।

কিছুটা এওপি উইজার্ড্রি দিয়ে, আপনি এমনকি প্রতিটি শৈলীর নামের সাথে নির্দিষ্টভাবে জেটর এবং সেটটারগুলি ব্যবহার করার অনুমতি দিয়েও শিমের মধ্যে অন্তর্নিহিত জটিলতা বজায় রাখতে পারতেন, প্রকৃতপক্ষে পৃথক ব্যক্তি এবং সেটটারগুলি লিখে না রেখে।


2

আপনি জাভা 8 স্ট্রিম ফিল্টার সংগ্রহকারীর বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন,

public Map<String, Object> objectToMap(Object obj) {
    return Arrays.stream(YourBean.class.getDeclaredMethods())
            .filter(p -> !p.getName().startsWith("set"))
            .filter(p -> !p.getName().startsWith("getClass"))
            .filter(p -> !p.getName().startsWith("setClass"))
            .collect(Collectors.toMap(
                    d -> d.getName().substring(3),
                    m -> {
                        try {
                            Object result = m.invoke(obj);
                            return result;
                        } catch (Exception e) {
                            return "";
                        }
                    }, (p1, p2) -> p1)
            );
}

1

আমার জাভাডুড বিন বিনোট প্রসেসর এটি করার জন্য কোড উত্পন্ন করে।

http://javadude.googlecode.com

উদাহরণ স্বরূপ:

@Bean(
  createPropertyMap=true,
  properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
  }
)
public class Person extends PersonGen {}

উপরেরটি সুপারক্লাস পার্সনজেন উত্পন্ন করে যার মধ্যে একটি ক্রিয়েপ্রোপার্টিম্যাপ () পদ্ধতি রয়েছে যা @ বিয়ান ব্যবহার করে সংজ্ঞাযুক্ত সমস্ত বৈশিষ্ট্যের জন্য একটি মানচিত্র উত্পন্ন করে।

(নোট করুন যে আমি পরবর্তী সংস্করণের জন্য আমি এপিআইটি কিছুটা পরিবর্তন করছি - টীকা বিশিষ্ট বৈশিষ্ট্যটি DefineCreatePropertyMap = সত্য হবে)


আপনি কি কোড-রিভিউ করেছেন? এই doens একটি ভাল পদ্ধতির বলে মনে হচ্ছে না! আপনি টীকা সহ উত্তরাধিকারের পথটি পরিবর্তন করুন! শিমটি যদি কোনও ক্লাসে ইতিমধ্যে প্রসারিত হয় তবে কী হবে ?! দু'বার গুণাবলী লিখতে হবে কেন?
মার্টিন কে।

আপনার যদি ইতিমধ্যে একটি সুপারক্লাস থাকে তবে আপনি @ বিয়ান (সুপারক্লাস = এক্সএক্সএক্সএল.এইচ। কোড পর্যালোচনার জন্য এটি দুর্দান্ত হয়েছে - ততোধিক ত্রুটি-প্রবণ বয়লারপ্লেট যাচাই করার জন্য।
স্কট স্ট্যাঞ্চফিল্ড

নিশ্চিত নয় যে আপনি "গুণাবলী দু'বার লিখে" বলতে কী বোঝায় - তারা দুবার কোথায় প্রদর্শিত হবে?
স্কট স্ট্যাঞ্চফিল্ড

@ মার্টিন কে। আপনি যদি সত্যিই হুডের নীচেও প্রতিবিম্ব ব্যবহার করতে না চান তবে আপনি সম্ভবত কিছু প্রকারের কোড জেনারেশন করতে বাধ্য হন।
এক্সারেনন

1

আপনার জেনেরিক ট্রান্সফর্মেশন সার্ভিস লেখা উচিত! এটিকে মুক্ত রাখতে জেনেরিক ব্যবহার করুন (যাতে আপনি প্রতিটি বস্তুকে কী => মান এবং পিছনে রূপান্তর করতে পারেন)।

কী ক্ষেত্রের মূল হওয়া উচিত? শিম থেকে সেই ক্ষেত্রটি পান এবং একটি মানচিত্রে অন্য কোনও অস্থায়ী মান যুক্ত করুন।

ফেরার পথটি বেশ সহজ। কী (এক্স) পড়ুন এবং প্রথমে কীটি লিখুন এবং তারপরে প্রতিটি তালিকায় নতুন কোনও অবজেক্টে ফিরে।

আপনি অ্যাপাচি কমন্স বিয়ান্টিলস সহ একটি শিমের সম্পত্তি নামগুলি পেতে পারেন !


1

আপনি যদি সত্যিই পারফরম্যান্স চান তবে আপনি কোড তৈরির পথে যেতে পারেন।

আপনি নিজের প্রতিচ্ছবিটি তৈরি করে এবং একটি মেশিন AspectJ ITD তৈরির মাধ্যমে এটি আপনার পক্ষে করতে পারেন।

অথবা আপনি স্প্রিং রু ব্যবহার করতে পারেন এবং একটি স্প্রিং রু অ্যাডন তৈরি করতে পারেন । আপনার রু অ্যাডন উপরের মতো কিছু করবে তবে স্প্রিং রু ব্যবহার করে এমন প্রত্যেকের জন্য উপলব্ধ থাকবে এবং আপনাকে রানটাইম টীকাগুলি ব্যবহার করতে হবে না।

দুটোই করেছি। লোকেরা স্প্রিং রুতে ক্রপ করে তবে এটি জাভার পক্ষে সবচেয়ে বিস্তৃত কোড জেনারেশন।


1

অন্য একটি সম্ভাব্য উপায় এখানে।

বিয়ান র্যাপার সম্পত্তি বৈশিষ্ট্য নির্ধারণ এবং (স্বতন্ত্রভাবে বা প্রচুর পরিমাণে) প্রাপ্তির জন্য, সম্পত্তি বর্ণনাকারী পেতে, এবং বৈশিষ্ট্যগুলি পাঠযোগ্য বা লিখিতযোগ্য কিনা তা নির্ধারণের জন্য কার্যকারিতা সরবরাহ করে।

Company c = new Company();
 BeanWrapper bwComp = BeanWrapperImpl(c);
 bwComp.setPropertyValue("name", "your Company");

1

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


1

জ্যাকসন লাইব্রেরির সাহায্যে স্ট্রিং / ইন্টিজার / ডাবল টাইপের সমস্ত শ্রেণীর বৈশিষ্ট্য এবং মানচিত্র শ্রেণিতে স্বতন্ত্র মানগুলি সন্ধান করতে সক্ষম হয়েছি। ( প্রতিবিম্ব এপিআই ব্যবহার না করে! )

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}

0

গসন ব্যবহার করে,

  1. POJO রূপান্তর করুন objectJSON করতে
  2. জেসনকে মানচিত্রে রূপান্তর করুন

        retMap = new Gson().fromJson(new Gson().toJson(object), 
                new TypeToken<HashMap<String, Object>>() {}.getType()
        );
    

হাই, আমার যদি কাঠামো যেমন ===> কর্পোরেট: {আইডি: 1; সংস্থা: {আইডি = 1, সদস্য: {আইডি: 1}} i আমি কী সব অনন্য কী এবং মানের মতো মানচিত্র পেতে পারি
লোকেশ কুমার

এটি কি আপনার জসন স্ট্রিং? {"corporate":{"id":1,"company":{"id":1,"member":{"id":1}}}}
Prabs

@ লোকেশকুমার আপনার জসন কী? একটি নতুন প্রশ্ন পোস্ট করুন এবং আমাকে লিঙ্ক দিন। আমি সাহায্য করার চেষ্টা করব।
Prabs

0

জাভা অবজেক্টটি সহজেই মানচিত্রে রূপান্তর করতে আমরা জ্যাকসন গ্রন্থাগারটি ব্যবহার করতে পারি।

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.6.3</version>
</dependency>

যদি কোনও অ্যান্ড্রয়েড প্রকল্পে ব্যবহার করা হয়, আপনি নীচে আপনার অ্যাপ্লিকেশনটির বিল্ড.gradle এ জ্যাকসন যুক্ত করতে পারেন:

implementation 'com.fasterxml.jackson.core:jackson-core:2.9.8'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.9.8'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'

নমুনা বাস্তবায়ন

public class Employee {

    private String name;
    private int id;
    private List<String> skillSet;

    // getters setters
}

public class ObjectToMap {

 public static void main(String[] args) {

    ObjectMapper objectMapper = new ObjectMapper();

    Employee emp = new Employee();
    emp.setName("XYZ");
    emp.setId(1011);
    emp.setSkillSet(Arrays.asList("python","java"));

    // object -> Map
    Map<String, Object> map = objectMapper.convertValue(emp, 
    Map.class);
    System.out.println(map);

 }

}

আউটপুট:

{নাম = এক্সওয়াইজেড, আইডি = 1011, দক্ষতা = [অজগর, জাভা]}

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