জাভা 8 স্থানীয় তারিখ জ্যাকসন ফর্ম্যাট


138

Java.util.Date এর জন্য আমি যখন করি

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")  
  private Date dateOfBirth;

তারপরে আমি যখন প্রেরণ করি তখন JSON এর অনুরোধে

{ {"dateOfBirth":"01/01/2000"} }  

এটা কাজ করে।

জাভা 8 এর স্থানীয় তারিখের ক্ষেত্রের জন্য আমি কীভাবে এটি করব ??

আমি চেষ্টা করেছি

@JsonDeserialize(using = LocalDateDeserializer.class)  
@JsonSerialize(using = LocalDateSerializer.class)  
private LocalDate dateOfBirth;  

এটি কাজ করে না।

কেউ কি দয়া করে আমাকে জানতে দিন এটি করার সঠিক উপায় কী ..

নীচে নির্ভরতা

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>jaxrs-api</artifactId>
     <version>3.0.9.Final</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.4.2</version>
</dependency>
<dependency>
    <groupId>com.wordnik</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.3.10</version>
</dependency>

উত্তর:


106

টীকাগুলি ব্যবহার করে আমি এটিকে সহজভাবে কাজ করতে সক্ষম হইনি। কাজ এটি পেতে, আমি একটি নির্মিত ContextResolverজন্য ObjectMapper, তারপর আমি যোগ JSR310Module( আপডেট: এখন এটা JavaTimeModuleপরিবর্তে ), আরও একটি সতর্কীকরণ, যা সেট লেখার-ডেট হিসাবে টাইমস্ট্যাম্প মিথ্যাতে করার প্রয়োজনীয়তা ছিল বরাবর। JSR310 মডিউলটির ডকুমেন্টেশনে আরও দেখুন । আমি কী ব্যবহার করেছি তার একটি উদাহরণ এখানে।

বশ্যতা

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.4.0</version>
</dependency>

দ্রষ্টব্য: আমি এর একটি সমস্যার মুখোমুখি হলাম যে jackson-annotationসংস্করণটি অন্য নির্ভরতা দ্বারা টানা হয়েছে, ব্যবহৃত সংস্করণ 2.3.2, যা দ্বারা প্রয়োজনীয় 2.4 বাতিল করে jsr310। যা ঘটেছিল আমি একটি NoClassDefFound পেয়েছিলাম ObjectIdResolver, এটি একটি 2.4 শ্রেণি। সুতরাং আমি কেবল অন্তর্ভুক্ত নির্ভরতা সংস্করণ লাইন করা প্রয়োজন

ContextResolver

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JSR310Module;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {  
    private final ObjectMapper MAPPER;

    public ObjectMapperContextResolver() {
        MAPPER = new ObjectMapper();
        // Now you should use JavaTimeModule instead
        MAPPER.registerModule(new JSR310Module());
        MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return MAPPER;
    }  
}

রিসোর্স ক্লাস

@Path("person")
public class LocalDateResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getPerson() {
        Person person = new Person();
        person.birthDate = LocalDate.now();
        return Response.ok(person).build();
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createPerson(Person person) {
        return Response.ok(
                DateTimeFormatter.ISO_DATE.format(person.birthDate)).build();
    }

    public static class Person {
        public LocalDate birthDate;
    }
}

পরীক্ষা

curl -v http://localhost:8080/api/person
ফলাফল: {"birthDate":"2015-03-01"}

curl -v -POST -H "Content-Type:application/json" -d "{\"birthDate\":\"2015-03-01\"}" http://localhost:8080/api/person
ফলাফল: 2015-03-01


এখানেও দেখুনজ্যাকএক্সবি সমাধানের জন্য ।

হালনাগাদ

JSR310Moduleজ্যাকসন সংস্করণ 2.7 এর হিসাবে অসমর্থিত হয়েছে। পরিবর্তে, আপনি মডিউল নিবন্ধন করা উচিত JavaTimeModule। এটি এখনও একই নির্ভরতা।


1
হাই পিসকিললেট, মাঠের জন্ম তারিখ, "জন্ম তারিখ": {"বছর": 0, "মাস": "মাস", "ডেও অফমোন্থ": 0, "ডেওঅফওইক": "ডেওফুইক", "যুগ": {" মান ": 0}," dayOfYear ": 0," leapYear ": মিথ্যা," মাসের মূল্য ": 0," কালানুক্রম ": {" id ":" "," ক্যালেন্ডার টাইপ ":" "}} আমি কীভাবে এটি তৈরি করতে পারি "জন্ম তারিখ" হিসাবে ???
জ্যাব 8

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

কনটেক্সট রিসোলভারকে পিসকিলেট বলা হচ্ছে না। আমি এটিকে ওয়েব.এক্সএমএলে <context-param> <param-name> resteasy.res উত্স </ p> আমি যে নির্ভরতাগুলি ব্যবহার করছি তার জন্য আপডেট হওয়া প্রশ্ন
জেবি

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

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

95

@ জসনসরিয়ালাইজ এবং @ জসনডিজারালাইজ আমার পক্ষে ভাল কাজ করেছে। তারা অতিরিক্ত jsr310 মডিউল আমদানি করার প্রয়োজনীয়তা দূর করে:

@JsonDeserialize(using = LocalDateDeserializer.class)  
@JsonSerialize(using = LocalDateSerializer.class)  
private LocalDate dateOfBirth;

Deserializer:

public class LocalDateDeserializer extends StdDeserializer<LocalDate> {

    private static final long serialVersionUID = 1L;

    protected LocalDateDeserializer() {
        super(LocalDate.class);
    }


    @Override
    public LocalDate deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        return LocalDate.parse(jp.readValueAs(String.class));
    }

}

Serializer:

public class LocalDateSerializer extends StdSerializer<LocalDate> {

    private static final long serialVersionUID = 1L;

    public LocalDateSerializer(){
        super(LocalDate.class);
    }

    @Override
    public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider sp) throws IOException, JsonProcessingException {
        gen.writeString(value.format(DateTimeFormatter.ISO_LOCAL_DATE));
    }
}

2
এটি আমার পক্ষে সেরা উত্তর। ধন্যবাদ!
রোমিও জুনিয়র মেরানান

7
এই ক্লাসগুলি অন্তর্ভুক্ত করা হয়েছে jackson-datatype-jsr310। আপনার প্রকল্পে সেগুলি ম্যানুয়ালি সংজ্ঞায়িত করার দরকার নেই।
নিউরোএক্সসি

1
এই সমাধানটি আমার জন্য কাজ করেছিল, সিরিয়ালাইজগুলি ব্যবহার করে jackson-datatype-jsr310
ডেভ

2
এটি নতুন সেরা উত্তর হওয়া উচিত।
ডাক্তার প্যারামিটার

1
আপনি যদি জ্যাকসন-ডেটাটাইপ-জেএসআর 310 তে সিরিয়ালাইজার এবং ডিসরিযালার ব্যবহার করেন তবে ভালভাবে আপনার ক্ষেত্রে @ জসনফর্ম্যাট (আকৃতি = জসনফর্ম্যাট.শ্যাপ.আরসিআরটিং) যুক্ত করুন। এই বিন্যাস ব্যতীত, মানটি [বছর, মাস, দিন] হিসাবে ক্রমিক করা হবে, যদিও ডিসরিয়ালেশন কাজ করবে।
জিয়ান চেন

74
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

আমার জন্য ভাল কাজ করে।


2
new com.fasterxml.jackson.datatype.jsr310.JSR310Module()জ্যাকসনের 2.5.4 সংস্করণের জন্য। জাভাটাইমমডুল ক্লাসটি এই সংস্করণে বিদ্যমান নেই।
ব্যবহারকারী 3774109

এই উত্তরটি LocalDateTime(জ্যাকসন ২.৯.৫) এর জন্যও কাজ করে । 1 অতিরিক্ত নির্ভরতা প্রয়োজন, সুতরাং আমার বিল্ড.এসবিটি দেখতে দেখতে:"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.9.5", "com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % "2.9.5"
রুহং

2
এর আরও বেশি ভোট হওয়া উচিত। সহজ এবং কার্যকর।
mkasberg

নিখুঁতভাবে কাজ করেছেন! ধন্যবাদ.
-হ্যাক্স

এটি আমাকে সঠিক দিকে ইশারা করে, ধন্যবাদ! আমি যোগ হবে বসন্ত-বুট সব আপনাকে যা করতে হবে application.properties নিম্নলিখিত যোগ করা হয়: spring.jackson.serialization.write-তারিখ হিসাবে টাইমস্ট্যাম্প = মিথ্যা
জুস্ট Lambregts

46

জ্যাকসন এবং জেএসআর 310 সংস্করণ "2.8.5" সহ স্প্রিং বুট ওয়েব অ্যাপে

compile "com.fasterxml.jackson.core:jackson-databind:2.8.5"
runtime "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.5"

@JsonFormatকাজ:

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate birthDate;

2
এই deserialization জন্য কাজ করে? নাকি কেবল সিরিয়ালাইজেশন?
Deserialization

7
আমাকে স্পষ্টতই @JsonDeserialize(using= LocalDateDeserializer.class)
deserializer

1
এতদূর সহজ!
আন্তোনিও

@JsonFormatশুধু আউটপুট ডেটা ফর্ম্যাট পরিবর্তন করার জন্য। stackoverflow.com/a/53251526/816759 সঙ্গে নিখুঁত কাজ করে @JsonFormat, @JsonDeserialize,@JsonSerialize
Baha,

স্প্রিং বুটে, একবার আপনি জেএসআর 310 নির্ভরতা যুক্ত করলে আপনাকে যা করতে হবে তা হ'ল spring.jackson.serialization.write-dates-as-timestamps=falseআপনার যুক্ত করা application.propertiesএবং এটি yyyy-MM-ddস্বয়ংক্রিয়ভাবে ফর্ম্যাট করে । দরকার নেই@JsonFormat
এসফান্দিয়া

31

সবচেয়ে সহজ সমাধান (যা ডিসরিওলাইজেশন এবং সিরিয়ালাইজেশন সমর্থন করে) হ'ল

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate dateOfBirth;

আপনার প্রকল্পে নিম্নলিখিত নির্ভরতা ব্যবহার করার সময়।

ম্যাভেন

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.9.7</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.9.7</version>
</dependency>

Gradle

compile "com.fasterxml.jackson.core:jackson-databind:2.9.7"
compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7"

কোনও কনটেক্সট রিসোলভার, সিরিয়ালাইজার বা ডিসরিযালাইজারের অতিরিক্ত প্রয়োগের প্রয়োজন নেই।


উজ্জ্বল, সবচেয়ে সহজ এবং খুব দূরে। প্রচুর নির্ভরতা সহ যে কারও জন্য এফওয়াইআই, আমাকে জ্যাকসন টীকা অন্তর্ভুক্ত করে এমন আরও কয়েকটি লাইব্রেরি আপডেট করতে হয়েছিল।
19

এই উত্তরটি আমার সমস্যাটি সমাধান করার জন্য আমার কাছে সবচেয়ে কাছের। সিরিয়ালাইজেশন কাজ করছে, তবে আমি @ জসনফর্ম্যাট আমার মনে হয় যে প্যাটার্নটি ব্যবহার করেছে (ডিজিটাল = "ডিডি-এমএম-ইয়াইএইচএইচ: মিমি: এসএস")
ফলে ডিসাইরিয়ালাইজেশন ব্যর্থ হচ্ছে

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

19

যেহেতু LocalDateSerializerএটিকে "[বছর, মাস, দিন]" (একটি জসন অ্যারে) পরিবর্তে "বর্ষ-মাস-দিন" (একটি জসন স্ট্রিং) ডিফল্টরূপে পরিণত করে এবং যেহেতু আমার কোনও বিশেষ ObjectMapperসেটআপের প্রয়োজন হয় না (আপনি পারেন করতে LocalDateSerializerস্ট্রিং উৎপন্ন যদি আপনি নিষ্ক্রিয় SerializationFeature.WRITE_DATES_AS_TIMESTAMPSকিন্তু যে অতিরিক্ত সেটআপ প্রয়োজন যে আপনারObjectMapper ), আমি নিম্নলিখিত ব্যবহার করুন:

আমদানি:

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;

কোড:

// generates "yyyy-MM-dd" output
@JsonSerialize(using = ToStringSerializer.class)
// handles "yyyy-MM-dd" input just fine (note: "yyyy-M-d" format will not work)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate localDate;

এবং এখন আমি কেবল new ObjectMapper()কোনও বিশেষ সেটআপ ছাড়াই আমার অবজেক্টগুলি পড়তে এবং লিখতে ব্যবহার করতে পারি।


3
আমি যে জিনিসটি যুক্ত করতে চাই তা হ'ল তারিখটি পাস করার "2018-12-07"পরিবর্তে "2018-12-7"আপনি একটি ত্রুটি পাবেন।
কিড 101

1
সঠিক, এটি yyyy-MM-dd(2 ডিজিট মাস এবং দিন) ফর্ম্যাট দিয়ে কাজ করে, yyyy-M-d(1 অঙ্কের মাস বা দিন) ফর্ম্যাট নয়।
শ্যাডো ম্যান

8

ক্রিস্টোফার উত্তরের একটি আপডেট।

সংস্করণটি ২.6.০ থেকে

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.0</version>
</dependency>

JSR310Module ( প্রত্যাশিত ) এর পরিবর্তে জাভাটাইমমডিউল ব্যবহার করুন ।

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {  
    private final ObjectMapper MAPPER;

    public ObjectMapperContextResolver() {
        MAPPER = new ObjectMapper();
        MAPPER.registerModule(new JavaTimeModule());
        MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return MAPPER;
    }  
}

ডকুমেন্টেশন অনুযায়ী , নতুন জাভাটাইমমোডিয়াল সিরিয়ালাইজেশনে ডিফল্ট করতে একই স্ট্যান্ডার্ড সেটিংস ব্যবহার করে যা টাইমজোন আইডি ব্যবহার করে না এবং পরিবর্তে কেবল আইএসও -8601 টাইমজোন অফসেট ব্যবহার করে।

সিরিয়ালাইজেশন ফিচার ব্যবহার করে আচরণ পরিবর্তন করা যেতে পারে W WRITE_DATES_WITH_ZONE_ID


এটি আমাকে সাহায্য করেছিল। আমার ক্ষেত্রে, আমার MAPPER.registerModule(new JavaTimeModule());লাইনটি যুক্ত করা দরকার । এটি আমাকে স্থানীয় তারিখের অবজেক্টগুলিকে "2020-02-20" ফর্ম্যাট হিসাবে ফর্ম্যাট করতে দেয়। আমার MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);লাইনটির দরকার নেই , আমি যা খুঁজছিলাম তার জন্য
কুগা

5

নিম্নলিখিত টিকাটি আমার পক্ষে ভাল কাজ করেছে worked

কোনও অতিরিক্ত নির্ভরতা প্রয়োজন।

    @JsonProperty("created_at")
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    private LocalDateTime createdAt;

5
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime createdDate;

4

https://stackoverflow.com/a/53251526/1282532 হ'ল সম্পত্তি সিরিয়ালালাইজ / ডিসাইরিয়ালাইজ করার সহজতম উপায়। এই পদ্ধতির বিষয়ে আমার দুটি উদ্বেগ রয়েছে - কিছুটা পয়েন্ট পর্যন্ত ডিআরওয়াই নীতি লঙ্ঘন এবং পোজো এবং ম্যাপারের মধ্যে উচ্চ সংযুক্তি।

public class Trade {
    @JsonFormat(pattern = "yyyyMMdd")
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate tradeDate;
    @JsonFormat(pattern = "yyyyMMdd")
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate maturityDate;
    @JsonFormat(pattern = "yyyyMMdd")
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate entryDate;
}

একাধিক লোকালডেট ক্ষেত্রের সাথে যদি আপনার পজো থাকে তবে POJO এর পরিবর্তে ম্যাপারটি কনফিগার করা ভাল। এটি https://stackoverflow.com/a/35062824/1282532 এর মতো সহজ হতে পারেআপনি যদি আইএসও -8601 মান ("2019-01-31") ব্যবহার করেন তবে

আপনার যদি কাস্টম ফর্ম্যাটটি পরিচালনা করতে হবে কোডটি এর মতো হবে:

ObjectMapper mapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyyMMdd")));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyyMMdd")));
mapper.registerModule(javaTimeModule);

যুক্তিটি একবার লেখা হয়, এটি একাধিক POJO এর জন্য পুনরায় ব্যবহার করা যেতে পারে


3

সবচেয়ে সহজ এবং এখন পর্যন্ত সংক্ষিপ্ততম:

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate localDate;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime;

স্প্রিং বুট> = 2.2+ এর সাথে কোনও নির্ভরতার প্রয়োজন নেই


1

২০২০ এবং জ্যাকসন ২.১০.১-তে কোনও বিশেষ কোডের দরকার নেই, জ্যাকসনকে আপনি কী চান তা বলার বিষয়:

ObjectMapper objectMapper = new ObjectMapper();

// Register module that knows how to serialize java.time objects
// Provided by jackson-datatype-jsr310
objectMapper.registerModule(new JavaTimeModule());

// Ask Jackson to serialize dates as String (ISO-8601 by default)
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

ইতিমধ্যে এই উত্তরে এটি উল্লেখ করা হয়েছে , আমি কার্যকারিতা যাচাই করে একটি ইউনিট পরীক্ষা যুক্ত করছি:

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.Data;
import org.junit.jupiter.api.Test;

import java.time.LocalDate;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class LocalDateSerializationTest {

    @Data
    static class TestBean {
        // Accept default ISO-8601 format
        LocalDate birthDate;
        // Use custom format
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
        LocalDate birthDateWithCustomFormat;
    }

    @Test
    void serializeDeserializeTest() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        // Register module that knows how to serialize java.time objects
        objectMapper.registerModule(new JavaTimeModule());

        // Ask Jackson to serialize dates as String (ISO-8601 by default)
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        // The JSON string after serialization
        String json = "{\"birthDate\":\"2000-01-02\",\"birthDateWithCustomFormat\":\"03/02/2001\"}";

        // The object after deserialization
        TestBean object = new TestBean();
        object.setBirthDate(LocalDate.of(2000, 1, 2));
        object.setBirthDateWithCustomFormat(LocalDate.of(2001, 2, 3));

        // Assert serialization
        assertEquals(json, objectMapper.writeValueAsString(object));

        // Assert deserialization
        assertEquals(object, objectMapper.readValue(json, TestBean.class));
    }
}

টেস্টবিয়ান শিমের জন্য বয়লারপ্লেট উত্পন্ন করতে লম্বোক ব্যবহার করে।


0

কনফিগারেশন ক্লাসে লোকালডেটরিশায়ালাইজার এবং লোকালডেটডিজারিলাইজার ক্লাস সংজ্ঞায়িত করুন এবং নিচের মতো জাভাটাইমমডুলের মাধ্যমে অবজেক্টম্যাপারে তাদের নিবন্ধ করুন :

@Configuration
public class AppConfig
{
@Bean
    public ObjectMapper objectMapper()
    {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(Include.NON_EMPTY);
        //other mapper configs
        // Customize de-serialization


        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
        mapper.registerModule(javaTimeModule);

        return mapper;
    }

    public class LocalDateSerializer extends JsonSerializer<LocalDate> {
        @Override
        public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString(value.format(Constant.DATE_TIME_FORMATTER));
        }
    }

    public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {

        @Override
        public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            return LocalDate.parse(p.getValueAsString(), Constant.DATE_TIME_FORMATTER);
        }
    }
}

0

আপনার অনুরোধে যদি এই জাতীয় কোনও বিষয় থাকে:

{
    "year": 1900,
    "month": 1,
    "day": 20
}

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

data class DateObject(
    val day: Int,
    val month: Int,
    val year: Int
)
class LocalDateConverter : StdConverter<DateObject, LocalDate>() {
    override fun convert(value: DateObject): LocalDate {
        return value.run { LocalDate.of(year, month, day) }
    }
}

মাঠের উপরে:

@JsonDeserialize(converter = LocalDateConverter::class)
val dateOfBirth: LocalDate

কোডটি কোটলিনে রয়েছে তবে এটি অবশ্যই জাভাটির জন্য কাজ করবে।

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