আমি কীভাবে জেএসএন স্ট্রিংয়ে সি # বেনামে টাইপ সিরিয়ালাইজ করব?


162

আমি JSON তে বেনামে টাইপ সিরিয়াল করতে নিম্নলিখিত কোডটি ব্যবহার করার চেষ্টা করছি:

var serializer = new DataContractJsonSerializer(thing.GetType());
var ms = new MemoryStream();
serializer.WriteObject(ms, thing);
var json = Encoding.Default.GetString(ms.ToArray()); 

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

'<> F__ অজ্ঞাতনামা টাইপ 1`3 টাইপ করুন [System.Int32, System.Int32, System.Object []]' সিরিয়াল করা যায় না। এটিকে ডেটা কন্ট্রাক্টঅ্যাট্রিবিউট অ্যাট্রিবিউট দিয়ে চিহ্নিত করার এবং তার সদস্যদের সকলকে চিহ্নিত করে আপনি ডেটামেবরঅ্যাট্রিবিউট অ্যাট্রিবিউট দিয়ে সিরিয়ালযুক্ত করতে চান। অন্যান্য সমর্থিত ধরণের জন্য মাইক্রোসফ্ট .NET ফ্রেমওয়ার্ক ডকুমেন্টেশন দেখুন।

আমি কোনও বেনামে (যেমন আমি জানি) বৈশিষ্ট্য প্রয়োগ করতে পারি না। এই সিরিয়ালাইজেশন করার অন্য কোনও উপায় আছে বা আমি কিছু মিস করছি?

উত্তর:


159

ডেটা কন্ট্রাক্ট জসনসিরাইজারের পরিবর্তে জাভাস্ক্রিপ্টসরিয়ালাইজার ব্যবহার করে দেখুন

JavaScriptSerializer serializer = new JavaScriptSerializer();
var output = serializer.Serialize(your_anon_object);

17
ট্র্যাকব্যাক, দেখে মনে হচ্ছে এটি এসপি 1-এ অবনমিত হয়েছে।
বিশ্বনাথ

7
অস্পষ্ট কোন কিছুর জন্য, এটি এমভিসি সহ অনেকগুলি নতুন মাইক্রোসফ্ট ফ্রেমওয়ার্কগুলিতে ব্যবহার হচ্ছে বলে মনে হয়। এ্যাসনেটকোডেপ্লেক্স
নিক বেরার্ডি

1
আমি এই আইআইএ নন-এসপি নেট প্রকল্পটি (কনসোল অ্যাপ্লিকেশন) কীভাবে অন্তর্ভুক্ত করব?
অ্যালেক্সান্ডার

4
@ অ্যালেক্সান্ডার: আপনাকে System.Web.Extensions.dllএকটি using System.Web.Script.Serialization;বিবৃতি উল্লেখ করতে হবে এবং যুক্ত করতে হবে ।
এলোমেলোভাবে

1
@ আর্যান্ডমগুই সমস্যাটি ছিল প্রকল্পের আউটপুট টাইপ ক্লায়েন্ট-প্রোফাইলে সেট করা হয়েছিল।
অ্যালেক্সান্ডার

75

অন্যরা যেমন বলেছে , নিউটনসফট জেএসএন ডট নেট একটি ভাল বিকল্প। সাধারণ জেএসওএন সিরিয়ালাইজেশনের জন্য এখানে একটি নির্দিষ্ট উদাহরণ রয়েছে:

return JsonConvert.SerializeObject(
    new
    {
       DataElement1,
       SomethingElse
    });

আমি এটি একটি খুব নমনীয়, বহুমুখী গ্রন্থাগার হিসাবে খুঁজে পেয়েছি।


14

আপনি আমার সার্ভিসস্ট্যাক জসনসিরাইজার চেষ্টা করতে পারেন এটি এই মুহুর্তে নেট। নেট জেএসএন সিরিয়ালাইজার । এটি ডেটা কন্ট্র্যাক্ট, যে কোনও পোকো প্রকার, ইন্টারফেস, অজানা প্রকারগুলি সহ দেরী-আবদ্ধ বস্তুগুলিকে সিরিয়ালকরণ সমর্থন করে etc.

বেসিক উদাহরণ

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = customer.ToJson();
var fromJson = json.FromJson<Customer>(); 

দ্রষ্টব্য: কেবলমাত্র মাইক্রোসফ্টস জাভাস্ক্রিপ্টসিরাইজার ব্যবহার করুন যদি পারফরম্যান্স আপনার পক্ষে গুরুত্বপূর্ণ না হয় কারণ আমার জেএসওএন সিরিয়ালাইজারগুলির চেয়ে 40x-100x অবধি ধীরে ধীরে এটি আমার মানদণ্ডের বাইরে রেখে যেতে হয়েছিল ।


7
আমি অল্প পরিমাণে ডেটা দিয়ে অবজেক্টগুলিকে সিরিয়ালাইজ করতে এমভিসি 3 স্ট্যাকের এমএস জাভাস্ক্রিপ্টসিরাইজার ব্যবহার করছি। এই ক্ষেত্রে এটি খুব দ্রুত, আমার যা প্রয়োজন তা করতে মিলিসেকেন্ডের চেয়ে কম সময় নেয়। ডিবি ক্যোরিয়ামে নিজেই 50x-100x বেশি সময় নেয়, সুতরাং এটি আমার অবস্থার ক্ষেত্রে সত্যিকারের কোনও গুরুত্বপূর্ণ বাধা নয়।
ব্রায়ান

2
অকাল অপটিমাইজেশন হ'ল ... আচ্ছা আপনি জানেন।
ম্যাথিয়াস লাইককেগার্ড লরেনজেন

1
"দ্রুততম। নেট জেএসওএন সিরিয়ালাইজার" লিঙ্কটি 404ing! এছাড়াও, এই উত্তরটি 5/2 বছরেরও বেশি পুরানো। আপনার কাছে বিভিন্ন। নেট জেএসএন সিরিয়ালাইজারের পারফরম্যান্সের আপডেট আছে?
এরিক

11

দয়া করে নোট করুন এটি ২০০৮ সাল থেকে Today


আমি তর্ক করব যে আপনার কোনও বেনামি ধরণের সিরিয়ালাইজ করা উচিত নয় । আমি এখানে প্রলোভন জানি; আপনি দ্রুত ব্রাউজারে কিছুটা ছুঁড়ে ফেলে প্রকারের উত্স তৈরি করতে চান যা কেবল environmentিলে .ালা ধরণের পরিবেশে ওরফে জাভাস্ক্রিপ্টে ব্যবহৃত হতে পারে। তবুও, আমি একটি আসল টাইপ তৈরি করব এবং এটিকে সিরিয়ালাইজেবল হিসাবে সাজাব। তারপরে আপনি নিজের ওয়েব পদ্ধতিগুলিকে দৃ strongly়তার সাথে টাইপ করতে পারেন। যদিও এটি জাভাস্ক্রিপ্টের জন্য একটি আইওটাকে গুরুত্ব দেয় না, এটি পদ্ধতিতে কিছু স্ব-ডকুমেন্টেশন যুক্ত করে। যে কোনও যুক্তিসঙ্গত অভিজ্ঞ প্রোগ্রামার ফাংশনটির স্বাক্ষরটি দেখতে এবং বলতে সক্ষম হবেন, "ওহ, এটি টাইপ ফু! আমি জানি যে এটি জেএসএন-তে কীভাবে দেখা উচিত" "

এটি বলার পরে, আপনি সিরিয়ালাইজেশন করতে JSON.Net চেষ্টা করতে পারেন। এটি কাজ করবে কিনা আমার ধারণা নেই


3
JSON.Net ঠিক কাজ করে। আমি তর্ক করব যে আপনার উচিত নয় :), আমি মনে করি এটি বেশিরভাগ ক্ষেত্রেই বেশ বৈধ।
এপ্রিলচাইল্ড

2
এমভিসিতে "ফেলে দেওয়া" ধরণের প্রকারগুলি দেখার পরে আমি কিছু বাধ্যমূলক ব্যবহার দেখতে পাচ্ছি। আমি মনে করি আপনার। নেট সরঞ্জাম বাক্সে রাখা এটি খুব সহজ সরঞ্জাম।
ম্যাথু হোয়াইট

12
এটি এমন একটি বিষয় যা আমি নরম করে দিয়েছি, বিশেষত কেবলমাত্র ব্যবহারের ধরণের ক্ষেত্রে। তবে যদি বস্তুটি সার্ভারে ফিরে যাওয়ার ট্রিপ করে চলেছে বা একাধিক স্থানে ব্যবহৃত হয় তবে আমি এখনও বিশ্বাস করি যে কোনও ধরণের তৈরি করলে কম সমস্যার সৃষ্টি হবে।
জেসন জ্যাকসন

ডেটা কন্ট্রাক্ট স্টাইল ডি-সিরিয়ালাইজেশন পলিমারফিক জাতীয় ধরণের হ্যান্ডেল করে না। আপনাকে নিজের ডি-সিরিয়ালাইজার লিখতে হবে। অনেক বেশি কোড রক্ষণাবেক্ষণ।
micahhoover

এমন কোনও ব্যবহারের ক্ষেত্রে যেখানে অজ্ঞাতনামা ধরণের সিরিয়ালাইজ করা কার্যকর হয় তা হ'ল ওয়েব এপিআইয়ের একক পরীক্ষা।
হাওচেং

9

আমি সবচেয়ে দ্রুততম উপায়টি পেয়েছি এটি হ'ল:

var obj = new {Id = thing.Id, Name = thing.Name, Age = 30};
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(obj);

নেমস্পেস: সিস্টেম. ওয়েবে.সক্রিপ্ট.সরিয়ালাইজেশন। জাভা স্ক্রিপ্টসরিয়ালাইজার


2
এবং deserialization জন্য:। । ডায়নামিক মাইবজেক্ট = জসনকনভার্ট.ডিজরিয়ালাইজ অবজেক্ট <লায়েনমিক> (আউটপুট); । । তথ্যসূত্র: Newtonsoft.json.dll
i31n যান

2

আপনি নিউটনসফট.জসন ব্যবহার করতে পারেন।

var warningJSON = JsonConvert.SerializeObject(new {
                warningMessage = "You have been warned..."
            });

1

ধরে নিই যে আপনি এটি কোনও ওয়েব পরিষেবার জন্য ব্যবহার করছেন, আপনি কেবল শ্রেণীর সাথে নিম্নলিখিত বৈশিষ্ট্যটি প্রয়োগ করতে পারেন:

[System.Web.Script.Services.ScriptService]

তারপরে জেসনকে ফিরিয়ে দেওয়া উচিত প্রতিটি পদ্ধতির জন্য নিম্নলিখিত বৈশিষ্ট্যগুলি:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

এবং পদ্ধতিগুলি "অবজেক্ট" হওয়ার জন্য রিটার্নের ধরণটি সেট করুন


একটি স্ট্যান্ডার্ড এএসপি ওয়েব সেবার জন্য [স্ক্রিপ্টমেথড (রেসপন্সফর্ম্যাট = রেসপন্স ফরম্যাট.জসন)] পদ্ধতিটিতে প্রয়োজন নেই, [ওয়েবমেথড] এটি করবে। এছাড়াও আপনাকে রিটার্ন টাইপটি অবজেক্টে সেট করা উচিত নয়, এটি একটি অ-জটিল (অর্থাৎ সিরিয়ালাইজড হতে পারে) টাইপের সাথে দৃ strongly়ভাবে টাইপ করা উচিত।
সারি 1

-1
public static class JsonSerializer
{
    public static string Serialize<T>(this T data)
    {
        try
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            var stream = new MemoryStream();
            serializer.WriteObject(stream, data);
            string jsonData = Encoding.UTF8.GetString(stream.ToArray(), 0, (int)stream.Length);
            stream.Close();
            return jsonData;
        }
        catch
        {
            return "";
        }
    }
    public static T Deserialize<T>(this string jsonData)
    {
        try
        {
            DataContractJsonSerializer slzr = new DataContractJsonSerializer(typeof(T));
            var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonData));
            T data = (T)slzr.ReadObject(stream);
            stream.Close();
            return data;
        }
        catch
        {
            return default(T);
        }
    }
}

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