জসন.নেটের সাথে সিরিয়াল করার সময় একটি কাস্টম ডেটটাইম ফর্ম্যাট নির্দিষ্ট করে


137

আমি এএসপি.নেট ওয়েব এপিআই ব্যবহার করে কিছু ডেটা প্রকাশ করতে একটি এপিআই বিকাশ করছি।

একটির এপিআইতে, ক্লায়েন্ট আমাদের yyyy-MM-ddফর্ম্যাটে তারিখটি প্রকাশ করতে চায় । আমি GlobalConfiguration.Configuration.Formatters.JsonFormatterএটির জন্য বিশ্বব্যাপী সেটিংস (উদাহরণস্বরূপ ) পরিবর্তন করতে চাই না কারণ এটি এই ক্লায়েন্টের সাথে খুব নির্দিষ্ট। এবং আমি একাধিক ক্লায়েন্টের সমাধানে এটি বিকাশ করি।

আমি যে সমাধানগুলির কথা ভাবতে পারি তার মধ্যে একটি হ'ল একটি কাস্টম তৈরি JsonConverterকরা এবং তারপরে কাস্টম ফর্ম্যাট করার জন্য আমার যে সম্পত্তিটি প্রয়োজন তা রেখে দেওয়া to

যেমন

class ReturnObjectA 
{
    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime ReturnDate { get;set;}
}

এটি করার আরও কিছু সহজ উপায় আছে কিনা তা ভাবছেন।


16
এটির মূল্যের জন্য, API গুলি কম্পিউটারের পঠনযোগ্যতার জন্য, ব্যবহারকারীর পাঠযোগ্যতার জন্য নয়, তাই আইএসও 8601 এর মতো একক নির্দিষ্ট তারিখের বিন্যাসে আটকে থাকা আরও ভাল । যদি ক্লায়েন্ট সরাসরি এপিআই ফলাফলটি ব্যবহারকারীকে প্রদর্শন করে বা এপিআই-র জন্য তাদের নিজস্ব তারিখ পার্সিং কোডটি লিখছে, তবে তারা এটি ভুল করছে। প্রদর্শনের জন্য একটি তারিখ ফর্ম্যাট করা শীর্ষস্থানীয় ইউআই স্তরতে রেখে দেওয়া উচিত।
এমটিগ্লিট 18

ভিসুয়াল স্টুডিও 2019 ব্যবহার করে ওয়েব এপিআই তৈরি করুন, দ্বারা নির্ধারিত ব্যবহার System.Text.Json ASP.NET কোর 3.0 বিন্যাস তারিখসময়
স্টিফেন

উত্তর:


162

তুমি কি সঠিক পথে আছো. যেহেতু আপনি বলেছেন যে আপনি বিশ্বব্যাপী সেটিংস সংশোধন করতে পারবেন না, তারপরে পরবর্তী সর্বোত্তম বিষয়টি হ'ল JsonConverterপ্রয়োজনীয়তার ভিত্তিতে বৈশিষ্ট্যটি প্রয়োগ করা , যেমন আপনি পরামর্শ করেছিলেন। দেখা যাচ্ছে যে জসন.নেটের ইতিমধ্যে একটি বিল্ট-ইন রয়েছে IsoDateTimeConverterযা আপনাকে তারিখের ফর্ম্যাট নির্দিষ্ট করতে দেয়। দুর্ভাগ্যক্রমে, আপনি JsonConverterঅ্যাট্রিবিউটের মাধ্যমে ফর্ম্যাটটি সেট করতে পারবেন না কারণ বৈশিষ্ট্যের একক যুক্তি এক প্রকারের। তবে, একটি সহজ সমাধান রয়েছে: সাবক্লাসটি IsoDateTimeConverter, তারপরে সাবক্লাসের কনস্ট্রাক্টরে তারিখের ফর্ম্যাটটি নির্দিষ্ট করুন। JsonConverterআপনার কাস্টম রূপান্তরকারী নির্দিষ্ট করে বৈশিষ্ট্যটি যেখানে প্রয়োজন সেখানে প্রয়োগ করুন এবং আপনি যেতে প্রস্তুত। এখানে প্রয়োজনীয় কোডের সম্পূর্ণতা এখানে রয়েছে:

class CustomDateTimeConverter : IsoDateTimeConverter
{
    public CustomDateTimeConverter()
    {
        base.DateTimeFormat = "yyyy-MM-dd";
    }
}

আপনি যদি সেখানে সময় কাটাতে আপত্তি না করেন তবে আপনার আইসোডেটটাইমকোনভার্টারটি সাবক্লাস করারও দরকার নেই। এর ডিফল্ট তারিখের ফর্ম্যাটটি yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK( উত্স কোড হিসাবে দেখা যায় )।


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

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

96

আপনি এই পদ্ধতির ব্যবহার করতে পারেন:

public class DateFormatConverter : IsoDateTimeConverter
{
    public DateFormatConverter(string format)
    {
        DateTimeFormat = format;
    }
}

এবং এটি এইভাবে ব্যবহার করুন:

class ReturnObjectA 
{
    [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")]
    public DateTime ReturnDate { get;set;}
}

ডেটটাইমফর্ম্যাট স্ট্রিংটি এখানে বর্ণিত .NET ফর্ম্যাট স্ট্রিং সিনট্যাক্স ব্যবহার করে: https://docs.microsoft.com/en-us/dotnet/standard/base-tyype/custom-date-and-time-format-strings


5
এটি আমার পক্ষে কাজ করে না - আমি পেয়েছি'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
ট্যাম কোটন

1
এটি সবচেয়ে নমনীয় সমাধান। আপনি যদি নিম্নলিখিত ত্রুটিটি পান: এর 'JsonConverterAttribute' does not contain a constructor that takes 2 argumentsঅর্থ আপনার জসন.নেটের সংস্করণটি খুব পুরানো। আপনাকে সর্বশেষতম json.net সংস্করণে আপডেট করতে হবে।
ফ্লোরিয়ান লাভোরেল

আমার জন্য কাজ কর. কোন সময় আমি কীভাবে সময় সরিয়ে ফেলতে পারি? সুতরাং কেবলমাত্র 2020-02-12 ফিরে আসুন উদাহরণস্বরূপ T00: 00: 00
এনরিকো

53

এটি IsoDateTimeConverterবিশ্বব্যাপী বিন্যাস সেটিংস পরিবর্তন না করে একটি উদাহরণ দিয়েও করা যেতে পারে :

string json = JsonConvert.SerializeObject(yourObject,
    new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });

এটি যুক্তি JsonConvert.SerializeObjectগ্রহণ করে ওভারলোড ব্যবহার করে params JsonConverter[]


5
আপনি যদি অনেক জায়গায় একই শ্রেণীর অবজেক্টকে সিরিয়ালাইজ করে থাকেন তবে স্বীকৃত উত্তরটি এর চেয়ে ভাল
কেজিজেদেব

16

সিরিয়ালাইজার সেটিংস ওভারলোডগুলির একটি ব্যবহার করেও উপলভ্য:

var json = JsonConvert.SerializeObject(someObject, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" });

অথবা

var json = JsonConvert.SerializeObject(someObject, Formatting.Indented, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" });

কোনও ধরণের ওভারলোডগুলি পাওয়া যায়।


2
এফওয়াইআই আমার মনে হয় আপনি বোঝাতে চেয়েছেন yyyy-MM-ddTHH:mm:ssZ.. ঘন্টা 24 ঘন্টা ঘড়ি।
Neek

9

সহায়ক শ্রেণি তৈরি করুন এবং এটি আপনার সম্পত্তি বৈশিষ্ট্যে প্রয়োগ করুন

সহায়ক শ্রেণি:

public class ESDateTimeConverter : IsoDateTimeConverter
{
    public ESDateTimeConverter()
    {
        base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffZ";
    }
}

আপনার কোডটি এর মতো ব্যবহার করুন:

[JsonConverter(typeof(ESDateTimeConverter))]
public DateTime timestamp { get; set; }

8
অন্যান্য বেশ কয়েকটি ব্যক্তি ইতিমধ্যে যা বলেছে তা কেন আপনি পুনরায় পুনরুক্তি করলেন?
লিয়াম

3

আমি ব্যবহার করছি আরও একটি সমাধান আছে। কেবল একটি স্ট্রিং সম্পত্তি তৈরি করুন এবং এটি জসনের জন্য ব্যবহার করুন। এই সম্পত্তি উইল রিটার্ন তারিখ সঠিকভাবে ফর্ম্যাটেড।

class JSonModel {
    ...

    [JsonProperty("date")]
    public string MyDate { get; set; }

    public string CustomDate {
        get { return MyDate.ToString("DDMMYY"); }
        set { MyDate = DateTime.Parse(value); }
    }

    ...
}

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


0

কিছু সময় জসন কনভার্ট অ্যাট্রিবিউট সাজানোর কাজ করবে না, এটি ব্যতিক্রমের মাধ্যমে বলবে যে " 2010-10-01" বৈধ তারিখ । এই ধরণের এড়াতে আমি সম্পত্তিটিতে জসন রূপান্তর বৈশিষ্ট্যটি সরিয়ে ফেলেছি এবং নীচের মতো deserilizedObject পদ্ধতিতে উল্লেখ করেছি।

var addresss = JsonConvert.DeserializeObject<AddressHistory>(address, new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" });

0

নীচে রূপান্তরকারী সহ

public class CustomDateTimeConverter : IsoDateTimeConverter
    {
        public CustomDateTimeConverter()
        {
            DateTimeFormat = "yyyy-MM-dd";
        }

        public CustomDateTimeConverter(string format)
        {
            DateTimeFormat = format;
        }
    }

এটি একটি ডিফল্ট কাস্টম ফর্ম্যাট সহ ব্যবহার করতে পারে

class ReturnObjectA 
{
    [JsonConverter(typeof(DateFormatConverter))]
    public DateTime ReturnDate { get;set;}
}

বা কোনও সম্পত্তির জন্য নির্দিষ্ট কোনও ফর্ম্যাট

class ReturnObjectB 
{
    [JsonConverter(typeof(DateFormatConverter), "dd MMM yy")]
    public DateTime ReturnDate { get;set;}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.