জিএসএন - তারিখের ফর্ম্যাট


187

আমি Gson আউটপুটে একটি কাস্টম তারিখ বিন্যাস আছে চেষ্টা করছি, কিন্তু .setDateFormat(DateFormat.FULL)কাজ বলে মনে হচ্ছে না এবং এটি একই .registerTypeAdapter(Date.class, new DateSerializer())

এটি গসনের মতো "তারিখ" অবজেক্টটির বিষয়ে চিন্তা করে না এবং এটি তার মতোভাবে মুদ্রণ করে।

আমি কীভাবে এটি পরিবর্তন করতে পারি?

ধন্যবাদ

সম্পাদনা করুন:

@Entity
public class AdviceSheet {
  public Date lastModif;
[...]
}

public void method {
   Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create();
   System.out.println(gson.toJson(adviceSheet);
}

আমি সবসময় ব্যবহার করি java.util.Date; setDateFormat()কাজ করে না :(


আপনি কি পরীক্ষা করেছেন যে আপনি সমস্ত জায়গায় সঠিক তারিখ-শ্রেণি আমদানি করছেন? কোড উদাহরণ সহায়ক হবে।
এমএল

আপনি কাজ করে না মানে কি? আপনি আসলে কি দেখতে পাচ্ছেন?
অ্যালিকেলজিন-কিলাকা

উত্তর:


305

দেখে মনে হচ্ছে আপনাকে তারিখ এবং সময় উভয় অংশের জন্য ফর্ম্যাটগুলি সংজ্ঞায়িত করতে হবে বা স্ট্রিং-ভিত্তিক ফর্ম্যাটিং ব্যবহার করতে হবে। উদাহরণ স্বরূপ:

Gson gson = new GsonBuilder()
   .setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create();

বা java.text.Date Format ব্যবহার করে

Gson gson = new GsonBuilder()
   .setDateFormat(DateFormat.FULL, DateFormat.FULL).create();

বা সিরিয়ালাইজার দিয়ে এটি করুন:

আমি বিশ্বাস করি যে ফর্ম্যাটরগুলি টাইমস্ট্যাম্পগুলি তৈরি করতে পারে না, তবে এই সিরিয়ালাইজার / ডিসারিয়ালাইজার-জুটি কাজ করছে বলে মনে হচ্ছে

JsonSerializer<Date> ser = new JsonSerializer<Date>() {
  @Override
  public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext 
             context) {
    return src == null ? null : new JsonPrimitive(src.getTime());
  }
};

JsonDeserializer<Date> deser = new JsonDeserializer<Date>() {
  @Override
  public Date deserialize(JsonElement json, Type typeOfT,
       JsonDeserializationContext context) throws JsonParseException {
    return json == null ? null : new Date(json.getAsLong());
  }
};

Gson gson = new GsonBuilder()
   .registerTypeAdapter(Date.class, ser)
   .registerTypeAdapter(Date.class, deser).create();

যদি জাভা 8 বা তার বেশি ব্যবহার করা হয় তবে আপনার উপরের সিরিয়ালাইজার / ডেসিরিয়াইজারগুলি ব্যবহার করা উচিত:

JsonSerializer<Date> ser = (src, typeOfSrc, context) -> src == null ? null
            : new JsonPrimitive(src.getTime());

JsonDeserializer<Date> deser = (jSon, typeOfT, context) -> jSon == null ? null : new Date(jSon.getAsLong());

ঠিক আছে এটি আপনার পথে আরও ভাল কাজ করে। তবে আমি কীভাবে এটিতে টাইমস্ট্যাম্পগুলি প্রদর্শন করতে পারি?
স্টাফেন পিটে

6
আমি জিএসন ২.২.৪ ব্যবহার করছি এবং Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();কাজ করছি।
রামশরণ

জিএসন ২.২.২ ব্যবহার করে এবং Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();কাজ করে
user2601995

66
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create();

উপরের ফর্ম্যাটটি আমার কাছে ভাল বলে মনে হচ্ছে কারণ এটি মিলিস অবধি নির্ভুলতা রয়েছে।


1
@ অভী - 'জেড' উদ্ধৃতি কেন প্রয়োজনীয়?
tj-recess

1
আমি উদ্ধৃতিগুলি না দিয়ে চেষ্টা করেছি এবং জিএসন ব্যতিক্রম ছুঁড়ে দিয়েছে যে তারিখটি পার্সেবল নয়। এটি কোনও উদ্ধৃতি ছাড়াই আপনার পক্ষে কাজ করে?
অভি

7
এটি সঠিক সমাধান নয় .. জেড মানে টাইমজোন এবং এটি ইউটিসি
টাইমজোনকে

5

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

Gson gson = new GsonBuilder()
   .registerTypeAdapter(java.sql.Date.class, ser).create();

এই বাগের প্রতিবেদনটি সম্পর্কিত হতে পারে: http://code.google.com/p/google-gson/issues/detail?id=230 । আমি যদিও সংস্করণ 1.7.2 ব্যবহার করি।


4

যদি আপনি অভ্যন্তরীণ ক্লাসগুলি ঘৃণা করেন তবে কার্যকরী ইন্টারফেসের সুবিধা নিয়ে আপনি জাভা 8 এ ল্যাম্বডা এক্সপ্রেশন সহ কম কোড লিখতে পারেন ।

JsonDeserializer<Date> dateJsonDeserializer = 
     (json, typeOfT, context) -> json == null ? null : new Date(json.getAsLong());
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,dateJsonDeserializer).create();

মনে হচ্ছে যে নাল চেক বাদ দেওয়া যেতে পারে (Gson এটি নিজে করে):Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, (JsonDeserializer) (json, typeOfT, context) -> new Date(json.getAsLong())).create();
gmk57

0

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


0

আপনি অন্য যে কোনও ফর্ম্যাট ব্যবহার করতে পারবেন তার Gson gson = builder.setDateFormat("yyyy-MM-dd").create(); পরিবর্তে আপনি এই পদ্ধতিতে আপনাকে ফর্ম্যাট নির্দিষ্ট yyyy-MM-ddকরতে পারেন

 GsonBuilder builder = new GsonBuilder();
                        builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
                            public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                                return new Date(json.getAsJsonPrimitive().getAsLong());
                            }
                        });

                        Gson gson = builder.setDateFormat("yyyy-MM-dd").create();

0

এটি একটি বাগ । বর্তমানে আপনাকে হয় timeStyleপাশাপাশি সেট করতে হবে বা অন্যান্য উত্তরে বর্ণিত বিকল্পগুলির একটি ব্যবহার করতে হবে।


0

আমি জিএসন ২.৮..6 এ আছি এবং আজ এই বাগটি আবিষ্কার করেছি।

আমার পদ্ধতির ফলে আমাদের সমস্ত বিদ্যমান ক্লায়েন্টদের (মোবাইল / ওয়েব / ইত্যাদি) তারা যেমন চলছিল তেমন কাজ চালিয়ে যেতে দেয়, তবে 24 ঘন্টা ফর্ম্যাট ব্যবহার করে এমনদের জন্য কিছু হ্যান্ডলিং যুক্ত করে এবং ভাল পরিমাপের জন্য মিলিসকেও অনুমতি দেয়।

Gson rawGson = new Gson();
SimpleDateFormat fmt = new SimpleDateFormat("MMM d, yyyy HH:mm:ss")
private class DateDeserializer implements JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        try {
            return new rawGson.fromJson(json, Date.class);
        } catch (JsonSyntaxException e) {}
        String timeString = json.getAsString();
        log.warning("Standard date deserialization didn't work:" + timeString);
        try {
            return fmt.parse(timeString);
        } catch (ParseException e) {}
        log.warning("Parsing as json 24 didn't work:" + timeString);
        return new Date(json.getAsLong());
    }
}

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Date.class, new DateDeserializer())
    .create();

আমি সমস্ত ক্রিয়াকলাপ স্ট্যান্ডার্ড জসন তারিখের ফর্ম্যাটটি বোঝে ঠিক তেমন সিরিয়ালাইজেশন রেখেছি।

সাধারণত, আমি চেষ্টা / ধরা ব্লক ব্যবহার করা ভাল অনুশীলন বলে মনে করি না, তবে এটি মোটামুটি বিরল ঘটনা হওয়া উচিত।

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