স্প্রিং বুটে JSON জাভা 8 লোকালডেটটাইম ফর্ম্যাট


112

আমার স্প্রিং বুট অ্যাপ্লিকেশনটিতে জাভা 8 লোকালডেটটাইম টাইম করার ক্ষেত্রে আমার একটি ছোট সমস্যা হচ্ছে। 'সাধারণ' তারিখগুলি নিয়ে আমার কোনও সমস্যা নেই তবে লোকালডেটটাইম ক্ষেত্রগুলি নিম্নলিখিতগুলিতে রূপান্তরিত হয়েছে:

"startDate" : {
    "year" : 2010,
    "month" : "JANUARY",
    "dayOfMonth" : 1,
    "dayOfWeek" : "FRIDAY",
    "dayOfYear" : 1,
    "monthValue" : 1,
    "hour" : 2,
    "minute" : 2,
    "second" : 0,
    "nano" : 0,
    "chronology" : {
      "id" : "ISO",
      "calendarType" : "iso8601"
    }
  }

যদিও আমি এটিকে এমন কিছুতে রূপান্তর করতে চাই:

"startDate": "2015-01-01"

আমার কোডটি এর মতো দেখাচ্ছে:

@JsonFormat(pattern="yyyy-MM-dd")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
public LocalDateTime getStartDate() {
    return startDate;
}

তবে উপরের টীকাগুলির কোনওটিই কাজ করে না, তারিখটি উপরের মতো ফর্ম্যাট হতে থাকে। পরামর্শ স্বাগত!

উত্তর:


134

আপডেট : স্প্রিং বুট 2.x এর জন্য এই কনফিগারেশনটির আর প্রয়োজন নেই। আমি এখানে আরও টু ডেট উত্তর লিখেছি ।


(স্প্রিং বুট ২.x এর আগে এটি করার উপায় এটি স্প্রিং বুটের পুরানো সংস্করণে কাজ করা লোকদের পক্ষে কার্যকর হতে পারে)

কীভাবে এটি করা যায় তা আমি অবশেষে এখানে পেয়েছি । এটি ঠিক করার জন্য, আমার আরও একটি নির্ভরতা দরকার:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.4.0")

এই নির্ভরতা অন্তর্ভুক্ত করে, বসন্তটি এখানে বর্ণিত হিসাবে স্বয়ংক্রিয়ভাবে এর জন্য একটি রূপান্তরকারী নিবন্ধভুক্ত করবে । এর পরে, আপনার অ্যাপ্লিকেশন.শক্তিগুলিতে নিম্নলিখিতগুলি যুক্ত করতে হবে:

spring.jackson.serialization.write_dates_as_timestamps=false

এটি নিশ্চিত করবে যে একটি সঠিক রূপান্তরকারী ব্যবহৃত হয়েছে এবং তারিখগুলি বিন্যাসে মুদ্রিত হবে 2016-03-16T13:56:39.492

আপনি তারিখের ফর্ম্যাটটি পরিবর্তন করতে চান এমন ক্ষেত্রে টীকাগুলির প্রয়োজন।


24
নিম্নলিখিত টীকাগুলি সহ সম্ভবত মূল্যবান - @JsonSerialize(using = LocalDateTimeSerializer.class)...
নিক গ্রেইলি

3
application.properties@ প্যাটেলব উত্তর দ্বারা প্রস্তাবিত হিসাবে কেবল একটি এন্ট্রি ব্যবহার করা ভাল ।
membersound

কাজ করছে না. কিন্তু পটেলিবের উত্তরটি কেবল বাক্সের বাইরে চলে গেছে!
মাইখায়লো কোপিটোনেনকো

শীর্ষস্থানীয় হিসাবে, নিকটিকে @JsonSerializeকাজ করার জন্য উল্লেখ করা টিকাটি আমাদের দরকার ।
পেনস্টেটেফিল

92

আমি com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.6.1নির্ভরতা যুক্ত করেছি এবং নিম্নলিখিত বিন্যাসে তারিখটি পেতে শুরু করেছি:

"birthDate": [
    2016,
    1,
    25,
    21,
    34,
    55
  ]

যা আমি চেয়েছিলাম তা নয় তবে আমি আরও কাছে আসছি। আমি তারপর নিম্নলিখিত যুক্ত

spring.jackson.serialization.write_dates_as_timestamps=false

অ্যাপ্লিকেশন.প্রেটিস ফাইলটিতে যা আমার প্রয়োজনীয় ফর্ম্যাটটি দিয়েছে।

"birthDate": "2016-01-25T21:34:55"

2
jackson-datatype-jsr310নির্ভরতা সহ যখন বাক্স থেকে কাজ করে । এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
সদস্যরা

6
এফওয়াইআই হিসাবে, অ্যাপ্লিকেশন.প্রপার্টি অংশটি জাভা কনফিগারেশনের মাধ্যমে করা যেতে পারে আপনি যদি অবজেক্টম্যাপারটি এতে কনফিগার করছেন:mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
জাস্টিন

31

এই সম্পত্তিটি মাভেনে রয়েছে যাতে আপনি বসন্ত বুটের আপগ্রেডের মধ্যে বেঁচে থাকতে পারেন

<dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>${jackson.version}</version>
</dependency>

1
@ নিকগ্রিলি মন্তব্য সহ এই সমাধানটি ব্যবহার করুন: নিম্নলিখিত টীকাটি সহ সম্ভবত মূল্যবান -@JsonSerialize(using = LocalDateTimeSerializer.class)
হেয়ারআফডডগ

19

1) নির্ভরতা

 compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.8.8' 

2) তারিখ-সময় বিন্যাস সহ টিকা।

public class RestObject {

    private LocalDateTime timestamp;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public LocalDateTime getTimestamp() {
        return timestamp;
    }
}

3) স্প্রিং কনফিগারেশন।

@Configuration
public class JacksonConfig {

    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        System.out.println("Config is starting.");
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return objectMapper;
    }
}

2
অনেক ধন্যবাদ. @ জেসনফর্ম্যাট হ'ল এটিই আমার জন্য সমাধান করেছে। উপরের সমাধানগুলির
কোনওটিই

7

আমি অন্য একটি সমাধান পেয়েছি যা আপনি এটি যে কোনও বিন্যাসে রূপান্তর করতে পারেন এবং সমস্ত লোকালডেটটাইম ডেটাটাইপগুলিতে প্রয়োগ করতে পারেন এবং আপনাকে প্রতিটি লোকালডিটটাইম ডেটাটাইপের উপরে @ জসনফর্ম্যাট নির্দিষ্ট করতে হবে না। প্রথমে নির্ভরতা যুক্ত করুন:

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

নিম্নলিখিত শিম যুক্ত করুন:

@Configuration
public class Java8DateTimeConfiguration {
    /**
     * Customizing
     * http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html
     *
     * Defining a @Bean of type Jackson2ObjectMapperBuilder will allow you to customize both default ObjectMapper and XmlMapper (used in MappingJackson2HttpMessageConverter and MappingJackson2XmlHttpMessageConverter respectively).
     */
    @Bean
    public Module jsonMapperJava8DateTimeModule() {
        val bean = new SimpleModule();

        bean.addDeserializer (ZonedDateTime.class, new JsonDeserializer<ZonedDateTime>() {
            @Override
            public ZonedDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
                return ZonedDateTime.parse(jsonParser.getValueAsString(), DateTimeFormatter.ISO_ZONED_DATE_TIME);
            }
        });

        bean.addDeserializer(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
            @Override
            public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
                return LocalDateTime.parse(jsonParser.getValueAsString(), DateTimeFormatter.ISO_LOCAL_DATE_TIME);
            }
        });

        bean.addSerializer(ZonedDateTime.class, new JsonSerializer<ZonedDateTime>() {
            @Override
            public void serialize(
                    ZonedDateTime zonedDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                    throws IOException {
                jsonGenerator.writeString(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zonedDateTime));
            }
        });

        bean.addSerializer(LocalDateTime.class, new JsonSerializer<LocalDateTime>() {
            @Override
            public void serialize(
                    LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                    throws IOException {
                jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime));
            }
        });

        return bean;
    }
}

আপনার কনফিগারেশন ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন:

@Import(Java8DateTimeConfiguration.class)

আপনি বসন্ত দ্বারা নির্মিত অবজেক্টম্যাপারটি যতক্ষণ ব্যবহার করছেন ততক্ষণ এটি স্থানীয় বৈশিষ্ট্য লোকালডেটটাইম এবং জোনডেটটাইম টাইমকে সিরিয়ালাইজ এবং ডি-সিরিয়ালাইজ করবে।

জোনডেটটাইম টাইমের জন্য আপনি যে ফর্ম্যাটটি পেয়েছেন তা হ'ল: লোকালডেটটাইমের জন্য "2017-12-27T08: 55: 17.317 + 02: 00 [এশিয়া / জেরুজালেম]": "2017-12-27T09: 05: 30.523"


প্রোব্যাবালি আপনাকে ভ্যাল বিনকে সিম্পলমোডুল বিন থেকে নতুন সিম্পলমোডুল () এ প্রতিস্থাপন করতে হবে;
অভিষেক গালোদা

এটি কি জাভা 9 for
ড্যানিয়েল ডাই

@ ড্যানিয়েলডাই এটি জাভা ৮-তে রয়েছে
ইদা অমিত

@Abhi, SimpleModuleপ্রসারিত ModuleModuleএকটি বিমূর্ততা। val bean = new SimpleModule(); নিখুঁত কাজ করে।
ইদা অমিত

স্প্রিংবুট সংস্করণ 1.5.3. এর জন্য জ্যাকসন-ডেটাটাইপ-জেএসআর 310 নির্ভরতা যুক্ত করার প্রয়োজন নেই RE
চাঁদ 13

7

এই উত্তরটি আমার জন্যও অনুস্মারক হিসাবে লেখা।

আমি এখানে বেশ কয়েকটি উত্তর একত্রিত করেছি এবং শেষ পর্যন্ত আমার এই জাতীয় কিছু নিয়ে কাজ করেছিল। (আমি স্প্রিংবুট 1.5.7 এবং লম্বোক 1.16.16 ব্যবহার করছি)

@Data
public Class someClass {

   @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
   @JsonSerialize(using = LocalDateTimeSerializer.class)
   @JsonDeserialize(using = LocalDateTimeDeserializer.class)
   private LocalDateTime someDate;

}

1
আপনি DateTimeFormatএবং অন্যদের জন্য আমদানি যুক্ত করতে চাইবেন ।
প্রেয়াগআপড

4

এই কাজ সূক্ষ্ম:

নির্ভরতা যুক্ত করুন:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>

টীকা যুক্ত করুন:

@JsonFormat(pattern="yyyy-MM-dd")

এখন, আপনাকে অবশ্যই সঠিক ফর্ম্যাটটি পেতে হবে।

অবজেক্ট ম্যাপার ব্যবহার করতে আপনার জাভাটাইম নিবন্ধন করতে হবে

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

1

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

তবে এর থেকে আরও ভাল - আপনার নিজের কোনও মডিউল নিজেকে নিবন্ধকরণ করার দরকার নেই। এখানে একবার দেখুন । যেহেতু ফণা নীচে @SpringBootApplicationব্যবহার @EnableAutoConfigurationকরা হয়, এর অর্থ JacksonAutoConfigurationস্বয়ংক্রিয়ভাবে প্রসঙ্গে যুক্ত হবে। এখন, আপনি যদি ভিতরে তাকান JacksonAutoConfiguration, আপনি দেখতে পাবেন:

    private void configureModules(Jackson2ObjectMapperBuilder builder) {
        Collection<Module> moduleBeans = getBeans(this.applicationContext,
                Module.class);
        builder.modulesToInstall(moduleBeans.toArray(new Module[0]));
    }

এই ফেল্লাকে প্রাথমিককরণের প্রক্রিয়ায় ডাকা হবে এবং এটি ক্লাসপথে খুঁজে পেতে পারে এমন সমস্ত মডিউল আনবে। (আমি স্প্রিং বুট ২.১ ব্যবহার করি)


1

আমি স্প্রিংবুট ২.০.২ ব্যবহার করছি এবং কোনও কারণে অ্যাপ্লিকেশন, yML পরিবর্তনগুলি কার্যকর হয়নি। এবং আমার আরও প্রয়োজনীয়তা ছিল।

আমি অবজেক্টম্যাপার তৈরি করে এটিকে প্রাথমিক হিসাবে চিহ্নিত করার চেষ্টা করেছি তবে বসন্তের বুট অভিযোগ করেছে যে ইতিমধ্যে আমার কাছে জ্যাকসনঅবজেক্টম্যাপার চিহ্নিত হিসাবে চিহ্নিত হয়েছে !!

সুতরাং আমি এই কি। আমি অভ্যন্তরীণ ম্যাপারে পরিবর্তন করেছি।

আমার সিরিয়ালাইজার এবং ডিসরিযালার বিশেষ - তারা 'ডিডি / এমএম / ওয়াইওয়াইওয়াই' দিয়ে কাজ করে; এবং ডি-সিরিয়ালিংয়ের সময় - আমার কাছে কিছু স্থানীয় তারিখ রয়েছে তা নিশ্চিত করার জন্য এটি 3-4 জনপ্রিয় ফর্ম্যাটটি ব্যবহার করার সর্বোচ্চ চেষ্টা করে।

@Autowired
ObjectMapper mapper;

@PostConstruct
public ObjectMapper configureMapper() {
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);

    mapper.configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, true);
    mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);

    SimpleModule module = new SimpleModule();
    module.addDeserializer(LocalDate.class, new LocalDateDeserializer());
    module.addSerializer(LocalDate.class, new LocalDateSerializer());
    mapper.registerModule(module);

    return mapper;
}

0

@JsonDeserialize(using= LocalDateDeserializer.class) নীচের নির্ভরতা নিয়ে আমার পক্ষে কাজ করে না।

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

আমি নীচে কোড রূপান্তরকারীটি ব্যবহার করে তারিখটিকে একটি এ পরিণত করেছি java.sql.Date

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;


@SuppressWarnings("UnusedDeclaration")
@Converter(autoApply = true)
public class LocalDateConverter implements AttributeConverter<java.time.LocalDate, java.sql.Date> {


    @Override
    public java.sql.Date convertToDatabaseColumn(java.time.LocalDate attribute) {

        return attribute == null ? null : java.sql.Date.valueOf(attribute);
    }

    @Override
    public java.time.LocalDate convertToEntityAttribute(java.sql.Date dbData) {

        return dbData == null ? null : dbData.toLocalDate();
    }
}

0

সহজভাবে ব্যবহার করুন:

@JsonFormat(pattern="10/04/2019")

অথবা আপনি যেমন পছন্দ করেন তেমন নিদর্শন ব্যবহার করতে পারেন: ('-' in place of '/')


এই উত্তরটি আগে ভাগ করা হয়েছে তবে তারপরে সঠিক বাক্য গঠন সহ।
এরিক প্রগেট

0

আমি স্প্রিং বুট ২.১.৮ ব্যবহার করছি। আমি আমদানি করেছি

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
</dependency>

যার মধ্যে জ্যাকসন-ডেটাটাইপ-জেএসআর 310 অন্তর্ভুক্ত রয়েছে ।

তারপরে, আমাকে এই টিকাগুলি যুক্ত করতে হবে

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonProperty("date")
LocalDateTime getDate();

এবং এটি কাজ করে। জেএসওএন এর মতো দেখাচ্ছে:

"date": "2020-03-09 17:55:00"

ইঙ্গিত: অন্তর্ভুক্ত spring-boot-starter-jsonকেবলমাত্র spring-boot-starter-webঅনুপস্থিত থাকলে প্রয়োজন ।
জুডমু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.