জেএসএন জ্যাকসনকে তারিখের ফর্ম্যাট ম্যাপিং


154

আমার মতো এপিআই থেকে আগত একটি তারিখের ফর্ম্যাট রয়েছে:

"start_time": "2015-10-1 3:00 PM GMT+1:00"

যা YYYY-DD-MM এইচ এইচ: এমএম am / pm GMT টাইমস্ট্যাম্প। আমি এই মানটি POJO- এ একটি তারিখের পরিবর্তনশীলকে ম্যাপ করছি। স্পষ্টতই, এটির রূপান্তর ত্রুটি দেখাচ্ছে।

আমি 2 টি জিনিস জানতে চাই:

  1. জ্যাকসনের সাথে রূপান্তর চালানোর জন্য আমার কী ফর্ম্যাটিং ব্যবহার করতে হবে? তারিখ কি এর জন্য ভাল ক্ষেত্রের ধরণ?
  2. সাধারণভাবে, জ্যাকসন দ্বারা অবজেক্ট সদস্যদের ম্যাপ করার আগে ভেরিয়েবলগুলি প্রক্রিয়া করার কোনও উপায় আছে কি? এর মতো কিছু, ফর্ম্যাট পরিবর্তন করা, গণনা ইত্যাদি

এটি সত্যই উদাহরণস্বরূপ, ক্লাসের মাঠে টীকাগুলি রাখুন: java.dzone.com/articles/how-serialize-javautildate
digz6666

তারিখটি পরিচালনা করার জন্য এখন তাদের কাছে একটি উইকি পৃষ্ঠা রয়েছে: wiki.fasterxML.com/JacksonFAQDateHandling
সূত্র

এই দিনগুলিতে আপনার আর Dateক্লাস ব্যবহার করা উচিত নয় । জাভা.টাইম, আধুনিক জাভা তারিখ এবং সময় এপিআই, প্রায় 5 বছর আগে এটি প্রতিস্থাপন করেছে। এটি এবং দ্রুততর এক্সএমএল / জ্যাকসন-মডিউল-জাভা 8 ব্যবহার করুন
ওলে ভিভি

উত্তর:


124

জ্যাকসনের সাথে রূপান্তর চালানোর জন্য আমার কী ফর্ম্যাটিং ব্যবহার করতে হবে? তারিখ কি এর জন্য ভাল ক্ষেত্রের ধরণ?

Dateএটির জন্য সূক্ষ্ম ক্ষেত্রের ধরণ। আপনি ব্যবহার করে খুব সহজেই JSON পার্স-সক্ষম করতে পারেন ObjectMapper.setDateFormat:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm a z");
myObjectMapper.setDateFormat(df);

সাধারণভাবে, জ্যাকসন দ্বারা অবজেক্ট সদস্যদের ম্যাপ করার আগে ভেরিয়েবলগুলি প্রক্রিয়া করার কোনও উপায় আছে কি? এর মতো কিছু, ফর্ম্যাট পরিবর্তন করা, গণনা ইত্যাদি

হ্যাঁ. আপনার কাছে কাস্টম বাস্তবায়ন সহ কয়েকটি বিকল্প রয়েছে JsonDeserializer, উদাহরণস্বরূপ প্রসারিত JsonDeserializer<Date>এটি একটি ভাল শুরু।


2
12 ঘন্টা বিন্যাস ভাল হয় যদি ফর্ম্যাটটিতে AM / PM উপাধি অন্তর্ভুক্ত থাকে: তারিখফর্ম্যাট ডিএফ = নতুন সিম্পলডেট ফরমেট ("yyyy-MM-dd hh: mm a z");
জন স্ক্যাটারগুড

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

1
এটি জাভা 8 ব্যবহার করা ঠিক তত সহজ LocalDateTimeবা ZonedDateTimeতার পরিবর্তে Date? যেহেতু Dateমূলত অবহেলিত (বা এর অন্ততপক্ষে অনেকগুলি পদ্ধতি), আমি সেই বিকল্পগুলি ব্যবহার করতে চাই।
হুক্রস

সেটসেট ফরমেট () এর জাভাদোকরা বলছেন যে এই কলটি অবজেক্টম্যাপারকে আর থ্রেডকে নিরাপদ করে না। আমি জসনসারিয়ালাইজার এবং জসনডিজারাইজার ক্লাস তৈরি করেছি।
মিগুয়েলমুনোজ

যেহেতু প্রশ্নটি java.util.Dateস্পষ্টভাবে উল্লেখ না করে আমি এটি উল্লেখ করতে চাই যে java.sql.Date.এটি আমার উত্তরও দেখুন নীচের জন্য কাজ করে না ।
পিতল বানর

329

জ্যাকসন ভি ২.০, যেহেতু আপনি @ জসনফর্ম্যাট টীকাটি সরাসরি অবজেক্ট সদস্যগুলিতে ব্যবহার করতে পারেন;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z")
private Date date;

61
আপনি যদি @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone="GMT")
টাইমজোনটি

হাই, কোন জারে সেই টিকা আছে। আমি জ্যাকসন-ম্যাপার-এসেল 1.9.10 সংস্করণ ব্যবহার করছি। আমি এটি পাচ্ছি না
কৃষ্ণ রাম

1
@ র্যামকি: জ্যাকসন-টিকা>> ২.০
অলিভিয়ার লেক্রিভাইন ২

3
এই টীকাটি কেবল সিরিয়ালাইজেশন পর্যায়ে পুরোপুরি কাজ করে তবে ডেসারিয়ালাইজেশনের সময় টাইমজোন এবং স্থানীয় তথ্য একেবারেই ব্যবহৃত হয় না। আমি লোকাল = "হু" সহ টাইমজোন = "সিইটি" এবং টাইমজোন "ইউরোপ / বুদাপেস্ট" চেষ্টা করেছি তবে ক্যালেন্ডারে অজানা সময় কথোপকথনের কারণ নয়। ডেসরিয়ালাইজেশন সহ কেবলমাত্র কাস্টম সিরিয়ালাইজেশন প্রয়োজনমতো টাইমজোন পরিচালনা করার জন্য আমার পক্ষে কাজ করেছিল। এখানে আপনার কীভাবে baeldung.com/jackson-serialize-dates
মিক্লোস

1
এই পৃথক বয়াম প্রকল্পের বলা হয় জ্যাকসন টীকা । নমুনা পোম এন্ট্রি
বুব

52

অবশ্যই সিরিয়ালাইজেশন এবং ডিসরিয়ালাইজেশন নামে একটি অটোমেটেড উপায় রয়েছে এবং আপনি পিবি 2 কিউ দ্বারা উল্লিখিত নির্দিষ্ট টীকাগুলি ( @ জসনসরিয়ালাইজ , @ জসনডিজারালাইজেশন ) দিয়ে এটি সংজ্ঞায়িত করতে পারেন ।

আপনি java.util.Date এবং java.util.Cocolate উভয়ই ব্যবহার করতে পারেন ... এবং সম্ভবত জোডটাইমও ব্যবহার করতে পারেন।

@ জেসনফরমেট টীকাগুলি আমার জন্য যেমনটি চেয়েছিল তেমন কাজ করেনি (এটি টাইমজোনকে বিভিন্ন মানের সাথে সামঞ্জস্য করেছে ) ডেসিরিয়ালেসনের সময় (সিরিয়ালাইজেশন নিখুঁতভাবে কাজ করেছিল):

@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "CET")

@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Europe/Budapest")

আপনি যদি পূর্বাভাসের ফলাফল চান তবে আপনার @Jsonformat টীকা পরিবর্তে কাস্টম সিরিয়ালাইজার এবং কাস্টম ডিসরিয়ালাইজার ব্যবহার করতে হবে। আমি এখানে সত্যিকারের ভাল টিউটোরিয়াল এবং সমাধান পেয়েছি http://www.baeldung.com/jackson-seialize-dates

তারিখের ক্ষেত্রগুলির জন্য উদাহরণ রয়েছে তবে আমার ক্যালেন্ডার ক্ষেত্রগুলির জন্য প্রয়োজন তাই আমার বাস্তবায়নটি এখানে :

Serializer শ্রেণী:

public class CustomCalendarSerializer extends JsonSerializer<Calendar> {

    public static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    public static final Locale LOCALE_HUNGARIAN = new Locale("hu", "HU");
    public static final TimeZone LOCAL_TIME_ZONE = TimeZone.getTimeZone("Europe/Budapest");

    @Override
    public void serialize(Calendar value, JsonGenerator gen, SerializerProvider arg2)
            throws IOException, JsonProcessingException {
        if (value == null) {
            gen.writeNull();
        } else {
            gen.writeString(FORMATTER.format(value.getTime()));
        }
    }
}

Deserializer শ্রেণী:

public class CustomCalendarDeserializer extends JsonDeserializer<Calendar> {

    @Override
    public Calendar deserialize(JsonParser jsonparser, DeserializationContext context)
            throws IOException, JsonProcessingException {
        String dateAsString = jsonparser.getText();
        try {
            Date date = CustomCalendarSerializer.FORMATTER.parse(dateAsString);
            Calendar calendar = Calendar.getInstance(
                CustomCalendarSerializer.LOCAL_TIME_ZONE, 
                CustomCalendarSerializer.LOCALE_HUNGARIAN
            );
            calendar.setTime(date);
            return calendar;
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

এবং উপরের ক্লাসগুলির ব্যবহার :

public class CalendarEntry {

    @JsonSerialize(using = CustomCalendarSerializer.class)
    @JsonDeserialize(using = CustomCalendarDeserializer.class)
    private Calendar calendar;

    // ... additional things ...
}

এই বাস্তবায়নটি ব্যবহার করে ক্রমিকায়ন এবং ডেসিরিয়ালাইজেশন প্রক্রিয়াটি ক্রমাগতভাবে মূল মানের ফলাফল করে।

কেবলমাত্র @ জসনফর্ম্যাট টীকাটি ডিসরিয়ালাইজেশন ব্যবহার করা বিভিন্ন ফলাফল দেয় বলে আমি মনে করি লাইব্রেরির অভ্যন্তরীণ টাইমজোন ডিফল্ট সেটআপের কারণে আপনি এনটোটেশন প্যারামিটারগুলি দিয়ে কী পরিবর্তন করতে পারবেন না (এটি আমার জ্যাকসন লাইব্রেরির ২.৩.৩ এবং ২.6.৩ সংস্করণ হিসাবেও ছিল)।


4
আমি গতকাল আমার উত্তরের জন্য ডাউনটোট পেয়েছি। আমি এই বিষয়টিতে অনেক কাজ করেছি তাই বুঝতে পারি না। আমি কি এটি থেকে কিছু প্রতিক্রিয়া পেতে পারি? ডাউনওয়েটের ক্ষেত্রে আমি কয়েকটি নোটের প্রশংসা করব। এইভাবে আমরা একে অপরের কাছ থেকে আরও শিখতে পারি।
মিক্লোস ক্রিভান

দুর্দান্ত উত্তর, ধন্যবাদ এটি আমাকে সত্যই সাহায্য করেছে! গৌণ পরামর্শ - কাস্টমক্যালেন্ডারশায়ালাইজার এবং কাস্টমক্যালেন্ডার ডিজিজারাইজারকে একটি সংযুক্তকারী পিতাম শ্রেণীর মধ্যে স্ট্যাটিক ক্লাস হিসাবে রাখার বিষয়ে বিবেচনা করুন। আমি মনে করি এটি কোডটি একটু সুন্দর করে তুলবে :)
স্টুয়ার্ট

@ স্টুয়ার্ট - আপনার কোডটিকে অন্য উত্তর হিসাবে কেবল পুনর্গঠনের প্রস্তাব দেওয়া উচিত, বা সম্পাদনার প্রস্তাব দেওয়া উচিত। মিক্লোসের কাছে এটি করার মতো সময় থাকতে পারে না।
অক্টোডো

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

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

4

ডেটটাইম ফর্ম্যাট সহ বসন্ত বুট অ্যাপ্লিকেশনটির জন্য কেবল একটি সম্পূর্ণ উদাহরণRFC3339

package bj.demo;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;

import java.text.SimpleDateFormat;

/**
 * Created by BaiJiFeiLong@gmail.com at 2018/5/4 10:22
 */
@SpringBootApplication
public class BarApp implements ApplicationListener<ApplicationReadyEvent> {

    public static void main(String[] args) {
        SpringApplication.run(BarApp.class, args);
    }

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"));
    }
}

4

আপনার তারিখে টি এবং জেড এর মতো অক্ষর যুক্ত করতে

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
private Date currentTime;

আউটপুট

{
    "currentTime": "2019-12-11T11:40:49Z"
}

3

আমার জন্য কাজ করছি। SpringBoot।

 import com.alibaba.fastjson.annotation.JSONField;

 @JSONField(format = "yyyy-MM-dd HH:mm:ss")  
 private Date createTime;

আউটপুট:

{ 
   "createTime": "2019-06-14 13:07:21"
}

2

@ মিক্লোভ-ক্রিভেনের খুব সহায়ক উত্তরের ভিত্তিতে বিল্ডিং করা, আমি আশা করি এই দুটি অতিরিক্ত বিবেচনার বিষয়গুলি কারও পক্ষে সহায়ক প্রমাণিত হয়েছে:

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

public class DateConverter {

    private static final ThreadLocal<SimpleDateFormat> sdf = 
        ThreadLocal.<SimpleDateFormat>withInitial(
                () -> {return new SimpleDateFormat("yyyy-MM-dd HH:mm a z");});

    public static class Serialize extends JsonSerializer<Date> {
        @Override
        public void serialize(Date value, JsonGenerator jgen SerializerProvider provider) throws Exception {
            if (value == null) {
                jgen.writeNull();
            }
            else {
                jgen.writeString(sdf.get().format(value));
            }
        }
    }

    public static class Deserialize extends JsonDeserializer<Date> {
        @Overrride
        public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws Exception {
            String dateAsString = jp.getText();
            try {
                if (Strings.isNullOrEmpty(dateAsString)) {
                    return null;
                }
                else {
                    return new Date(sdf.get().parse(dateAsString).getTime());
                }
            }
            catch (ParseException pe) {
                throw new RuntimeException(pe);
            }
        }
    }
}

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

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public Module customModule() {
        SimpleModule module = new SimpleModule();
        module.addSerializer(Date.class, new DateConverter.Serialize());
        module.addDeserializer(Date.class, new Dateconverter.Deserialize());
        return module;
    }
}

আমি আপনাকে হ্রাস করেছি (আমি ডাউনভোটিংকে ঘৃণা করি তবে আমি চাই না লোকেরা আপনার উত্তরটি ব্যবহার করুক) সিম্পলডিটফর্ম্যাটটি থ্রেডসেফ নয়। এটি 2016 (আপনি 2016 সালে উত্তর দিয়েছেন)। যখন অনেকগুলি দ্রুত এবং থ্রেডসেফ বিকল্প রয়েছে তখন আপনি সিম্পলডেটফর্ম্যাটটি ব্যবহার করবেন না। আপনি এখানে কিউ / এ প্রস্তাব করছেন তার সঠিক অপব্যবহারও রয়েছে: স্ট্যাকওভারফ্লো
অ্যাডাম জেন্ট

2
এটি দেখানোর জন্য @ অ্যাডামজেন্ট ধন্যবাদ। এই প্রসঙ্গে, জ্যাকসন ব্যবহার করে, অবজেক্টম্যাপার ক্লাসটি থ্রেড নিরাপদ তাই কোনও ব্যাপার নয়। যাইহোক, আমি আপনার বক্তব্য গ্রহণ করি যে কোডটি অনুলিপি নিরাপদ প্রসঙ্গে কোড অনুলিপি এবং ব্যবহার করা যেতে পারে। তাই আমি সিম্পলডেট ফরমেট থ্রেডটিতে অ্যাক্সেস তৈরি করতে আমার উত্তর সম্পাদনা করেছি। আমি স্বীকার করি এর বিকল্পগুলি রয়েছে, প্রাথমিকভাবে জাভা.টাইম প্যাকেজ।
স্টুয়ার্ট

2

Java.sql. তারিখের জন্য যদি কাস্টম ডেটফর্ম্যাট ব্যবহার করতে কারও সমস্যা হয় তবে এটি সহজ সমাধান:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(java.sql.Date.class, new DateSerializer());
mapper.registerModule(module);

(এই SO- উত্তর আমাকে অনেক ঝামেলা বাঁচিয়েছিল: https://stackoverflow.com/a/35212795/3149048 )

জ্যাকসন java.sql.Date- এর জন্য ডিফল্টরূপে স্কেলডেটসরিয়ায়ালার ব্যবহার করেন তবে বর্তমানে এই সিরিয়ালাইজারটি তারিখের ফর্মটিকে বিবেচনায় নেয় না, এই সমস্যাটি দেখুন: https://github.com/FasterXML/jackson-databind/issues/1407 । কাজের উদাহরণটি জাভা.এসকিউএল.র তারিখের জন্য কোডের উদাহরণ হিসাবে দেখানো হয়েছে বলে আলাদা সিরিয়ালাইজার রেজিস্ট্রেশন করা।


1

আমি এটি উল্লেখ করতে SimpleDateFormatচাই যে অন্য উত্তরে বর্ণিত একটি পছন্দটি সেট করা কেবলমাত্র সেই প্রশ্নের জন্যই কাজ করে java.util.Dateযা আমি অনুমান করি যে প্রশ্নটিতে বোঝানো হচ্ছে। তবে java.sql.Dateফর্ম্যাটারে কাজ হয় না। আমার ক্ষেত্রে এটি খুব সুস্পষ্ট ছিল না যে ফর্ম্যাটারটি কেন কাজ করে না কারণ যে মডেলটিতে ক্ষেত্রটি সিরিয়াল করা উচিত বাস্তবে এটি ছিল java.utl.Dateতবে প্রকৃত বস্তুটি মৌমাছিতে শেষ হয়েছিল java.sql.Date। এটা সম্ভব কারণ

public class java.sql extends java.util.Date

সুতরাং এটি আসলে বৈধ

java.util.Date date = new java.sql.Date(1542381115815L);

সুতরাং আপনি যদি ভাবছেন যে কেন আপনার তারিখের ক্ষেত্রটি সঠিকভাবে ফর্ম্যাট করা হচ্ছে না তা নিশ্চিত করুন যে বস্তুটি আসলেই একটি java.util.Date

এখানে কেন হ্যান্ডলিং এছাড়াও উল্লেখ করা হয় java.sql.Dateযুক্ত হবে না।

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


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