আমি কীভাবে সি # তে একটি JSON স্ট্রিংয়ে একটি অভিধান রূপান্তর করব?


131

আমি আমার Dictionary<int,List<int>>JSON স্ট্রিংয়ে রূপান্তর করতে চাই । কেউ কি সি # তে এটি অর্জন করতে জানেন?


3
NewtonSoft.json nuget প্যাকেজটি ব্যবহার করুন। জসনকনভার্ট.সিরাইলাইজ অবজেক্ট (আপনার অবজেক্ট)
রায়লভলেস

উত্তর:


118

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

একটি জন্য Dictionary<int, List<int>>যেমন আপনার নির্দিষ্ট করা হয়েছে, আপনি Linq ব্যবহার করতে পারেন:

string MyDictionaryToJson(Dictionary<int, List<int>> dict)
{
    var entries = dict.Select(d =>
        string.Format("\"{0}\": [{1}]", d.Key, string.Join(",", d.Value)));
    return "{" + string.Join(",", entries) + "}";
}

তবে, যদি আপনি বেশ কয়েকটি বিভিন্ন ক্লাস, বা আরও জটিল ডেটা স্ট্রাকচারকে সিরিয়ালাইজ করছেন, বা বিশেষত যদি আপনার ডেটাতে স্ট্রিংয়ের মান রয়েছে তবে আপনি ইতিমধ্যে জেএসএন লাইব্রেরি ব্যবহার করে ভাল হবেন যে ইতিমধ্যে পলায়ন চরিত্র এবং লাইন ব্রেকগুলির মতো জিনিসগুলি কীভাবে পরিচালনা করতে হবে তা জানেন। জসন.এনইটি একটি জনপ্রিয় বিকল্প।


66
এই সমাধানটি সেরা নির্বোধ na একটি আসল জসন সিরিয়ালাইজেশন লাইব্রেরি ব্যবহার করুন।
জ্যাকোসিমিওন

131
@ জ্যাকব - নিষ্পাপ? সেকি। ব্যক্তিগতভাবে, আমি অন্য একটি সমাবেশ অন্তর্ভুক্ত করে ন্যায়সঙ্গত করতে পারি না যখন আমার যা করা দরকার তা একটি সংক্ষিপ্ত এবং সাধারণ পদ্ধতিতে সম্পন্ন করা যায়।
গিলি 3

16
আরও একটি + গিলি 3 মন্তব্যে। একসময় আপনি উইন্ডোজ ফোনে কোডিং করছেন। আপনি জ্লিপ, টুইটার, গুগল, অডিও প্রসেসিং স্টাফ, ইমেজ প্রসেসিং স্টাফ যুক্ত করছেন। আপনি এর মতো সহজ পদ্ধতিটি আরও ভালভাবে প্রয়োগ করেছেন এবং যদি আপনার ব্যবহার সহজ হয় তবে সামাজিক যোগাযোগের জন্য কিছু প্রাথমিক HTTP অনুরোধ R অ্যাসেমব্লি যুক্ত করার সময়, আপনাকে সর্বদা বাগগুলি এবং লাইট সংস্করণ পাওয়ার অসম্ভবতার সাথে মোকাবিলা করতে হবে। যাইহোক, জসন লিবসের অভ্যন্তরে, এই জাতীয় মজাদার পদ্ধতি রয়েছে এবং কোনও যাদু নেই।
Lonon Pelletier

14
প্রতিটি উন্মুক্ত প্রকল্পে একটি পৃষ্ঠা থাকা উচিত যা আপনাকে বলে: "আরে, বেশিরভাগ সময় আপনি কেবল এই 10 টি লাইনই চালিত করতে চান Here কোডটি এখানে।"
Lonon Pelletier

31
ডিক্ট্যাড ("র্যান্ডমকি \" "," র্যান্ডমভ্যালু \ ""); BOOOOOOOOOOOOOOOOM। নিখুঁত। একটি আসল জসন সিরিয়ালাইজেশন লাইব্রেরি ব্যবহার করুন।
স্লিপার স্মিথ

112

এই উত্তরে জসন.এনইটি উল্লেখ করা হয়েছে তবে আপনি কীভাবে কোনও অভিধান ক্রমিকায়িত করতে Json.NET ব্যবহার করতে পারেন তা বলার অপেক্ষা রাখে না:

return JsonConvert.SerializeObject( myDictionary );

জাভাস্ক্রিপ্টশিরাইজারের বিপরীতে, কাজ করার জন্য জসনকনভার্টের জন্য অভিধানের কোনও myDictionaryধরণের <string, string>অভিধানের দরকার নেই।


71

জসন.এনইটি সম্ভবত এখন সি # অভিধানগুলিকে পর্যাপ্ত পর্যায়ে সিরিয়ালাইজ করেছে, তবে ওপি যখন মূলত এই প্রশ্নটি পোস্ট করেছিল তখন অনেক এমভিসি বিকাশকারী জাভাস্ক্রিপ্টসিরাইজার ক্লাসটি ব্যবহার করছিল কারণ এটি বাক্সের বাইরে ডিফল্ট বিকল্প ছিল।

যদি আপনি কোনও লিগ্যাসি প্রকল্পে (এমভিসি 1 বা এমভিসি 2) কাজ করে থাকেন এবং আপনি জসন.এনইটি ব্যবহার করতে না পারেন তবে আমি প্রস্তাব দিচ্ছি যে আপনি একটি এর List<KeyValuePair<K,V>>পরিবর্তে একটি ব্যবহার করুন Dictionary<K,V>>। উত্তরাধিকারী জাভাস্ক্রিপ্টসিরাইজার ক্লাস এই ধরণের সিরিয়ালাইজ করবে ঠিকই, তবে এটি অভিধানে সমস্যা রয়েছে।

ডকুমেন্টেশন: জসন.এনইটি দিয়ে সংগ্রহগুলি সিরিয়ালিং করা হচ্ছে


3
Asp.net mvc3 এবং mvc4 ব্যবহারকারীদের জন্য নিখুঁত উত্তর
Gomes

জাভাস্ক্রিপ্টে যখন পাঠ করা হয় তখন জাসনকনভার্ট.সিরালাইজঅবজেক্ট সি # অভিধান অভিধানে এক ধরণের গণ্যমানের সংগ্রহে হ্যান্ডেল করে না। বরং এটি এমন একটি বস্তু তৈরি করে যেখানে সি # সংগ্রহের প্রতিটি জুটি এখন কোনও সামগ্রীর একটি সরল সম্পত্তি / মান, যা সংগ্রহের মতো সহজেই গণনা করা যায় না। সুতরাং, যদি আমার কাছে নুগেটের কোনও খারাপ সংস্করণ না থাকে, Json.NET এখনও এই বিষয়ে পর্যাপ্ত নয় .in
স্টিংজি জ্যাক

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

20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Json;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<int, List<int>> foo = new Dictionary<int, List<int>>();

            foo.Add(1, new List<int>( new int[] { 1, 2, 3, 4 }));
            foo.Add(2, new List<int>(new int[] { 2, 3, 4, 1 }));
            foo.Add(3, new List<int>(new int[] { 3, 4, 1, 2 }));
            foo.Add(4, new List<int>(new int[] { 4, 1, 2, 3 }));

            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<int, List<int>>));

            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, foo);
                Console.WriteLine(Encoding.Default.GetString(ms.ToArray()));
            }
        }
    }
}

এটি কনসোলে লিখবে:

[{\"Key\":1,\"Value\":[1,2,3,4]},{\"Key\":2,\"Value\":[2,3,4,1]},{\"Key\":3,\"Value\":[3,4,1,2]},{\"Key\":4,\"Value\":[4,1,2,3]}]

19

সাধারণ এক-লাইন উত্তর

( using System.Web.Script.Serialization)

এই কোড কোন রূপান্তর করবে Dictionary<Key,Value>করার Dictionary<string,string>এবং তারপর একটি JSON স্ট্রিংকে যেমন ধারাবাহিকভাবে:

var json = new JavaScriptSerializer().Serialize(yourDictionary.ToDictionary(item => item.Key.ToString(), item => item.Value.ToString()));

এটা লক্ষণীয় যে Dictionary<int, MyClass>, জটিল টাইপ / অবজেক্টটি সংরক্ষণের সময় এই জাতীয় কিছুও এভাবে সিরিয়াল করা যেতে পারে।


ব্যাখ্যা (ভাঙ্গন)

var yourDictionary = new Dictionary<Key,Value>(); //This is just to represent your current Dictionary.

আপনি yourDictionaryআপনার আসল ভেরিয়েবলের সাথে পরিবর্তনশীলটি প্রতিস্থাপন করতে পারেন ।

var convertedDictionary = yourDictionary.ToDictionary(item => item.Key.ToString(), item => item.Value.ToString()); //This converts your dictionary to have the Key and Value of type string.

আমরা এটি করি, কারণ কী এবং মান উভয়ই টাইপের স্ট্রিং হতে হবে, এটির ক্রমিককরণের প্রয়োজন হিসাবে Dictionary

var json = new JavaScriptSerializer().Serialize(convertedDictionary); //You can then serialize the Dictionary, as both the Key and Value is of type string, which is required for serialization.

আমার সি # তে আমার কাছে জাভাস্ক্রিপ্টসিরাইজার নেই।
জনি

1
@Jonny আপনি রেফারেন্স সমাবেশ System.Web.Extensions অনুপস্থিত msdn.microsoft.com/en-us/library/...
aminhotob

আমি পড়েছি যা System.Web.Extensionsক্লায়েন্ট ফ্রেমওয়ার্ক সংস্করণে নেই, তবে সম্পূর্ণ সংস্করণও প্রয়োজন।
vapcguy

সীমাবদ্ধ অ্যাপ্লিকেশনগুলির জন্য সমাধান হতে পারে, তবে সমস্ত মানকে স্ট্রিং টাইপ করতে বাধ্য করা সঠিক জেএসওন দেয় না যদি কোনও বস্তুর বৈশিষ্ট্য টাইপ স্ট্রিং না থাকে।
সানক্যাট 2000

1
এই বিষয়ে সেরা উত্তর।
টুডো

12

দুঃখিত যদি সিনট্যাক্সটি সবচেয়ে ক্ষুদ্রতম বিট বন্ধ থাকে তবে আমি যে কোডটি থেকে এ পাচ্ছি তা মূলত ভিবিতে ছিল :)

using System.Web.Script.Serialization;

...

Dictionary<int,List<int>> MyObj = new Dictionary<int,List<int>>();

//Populate it here...

string myJsonString = (new JavaScriptSerializer()).Serialize(MyObj);

2
এটি আর্গুমেন্টএক্সেপশনকে নিক্ষেপ করে: টাইপ করুন 'সিস্টেম.কলেশনস.জেনারিক.ডিজারিও 2 অভিধানের সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশনের জন্য সমর্থিত নয়, কীগুলি অবশ্যই স্ট্রিং বা অবজেক্ট হতে হবে।
পাভেল চুচুভা


7

Asp.net মূল ব্যবহারে:

using Newtonsoft.Json

var obj = new { MyValue = 1 };
var json = JsonConvert.SerializeObject(obj);
var obj2 = JsonConvert.DeserializeObject(json);

আমি রেফারেন্স দিয়েছি System.Coreএবং তারপরে রেফারেন্স দেওয়ার চেষ্টা করেছি using Newtonsoft.Jsonএবং আনন্দ নেই। আমি মনে করি Newtonsoftএকটি তৃতীয় পক্ষের লাইব্রেরি।
vapcguy

2
@ বাপকুই হ্যাঁ, নিউটনসফ্ট তৃতীয় পক্ষের হলেও তাদের পণ্যগুলিতে এমএস দ্বারা ব্যাপকভাবে ব্যবহৃত এবং গৃহীত হয়েছে। nuget.org/packages/Newtonsoft.Json
Skorunka František

7

আপনি ব্যবহার করতে পারেন System.Web.Script.Serialization.JavaScriptSerializer:

Dictionary<string, object> dictss = new Dictionary<string, object>(){
   {"User", "Mr.Joshua"},
   {"Pass", "4324"},
};

string jsonString = (new JavaScriptSerializer()).Serialize((object)dictss);

2

এটি কেবলমাত্র স্ট্যান্ডার্ড। মাইক্রোসফ্ট থেকে নেট লাইব্রেরি ব্যবহার করে কীভাবে করা যায় তা এখানে ...

using System.IO;
using System.Runtime.Serialization.Json;

private static string DataToJson<T>(T data)
{
    MemoryStream stream = new MemoryStream();

    DataContractJsonSerializer serialiser = new DataContractJsonSerializer(
        data.GetType(),
        new DataContractJsonSerializerSettings()
        {
            UseSimpleDictionaryFormat = true
        });

    serialiser.WriteObject(stream, data);

    return Encoding.UTF8.GetString(stream.ToArray());
}

আমরা এটিকে একত্রিত করতে Dictionary<string, dynamic>এবং সমস্ত JSON আদিম ধরণের যেমন ইন্টিজার, ফ্লোটস, বুলিয়ানস, স্ট্রিংগুলি এমনকি নালগুলি এবং একটি বস্তুর মধ্যে রাখতে পারি। +1
ক্রিস্টোস লাইট্রাস

1

আপনি জাভাস্ক্রিপ্টসিরাইজার ব্যবহার করতে পারেন ।


অভিধানগুলি সিরিয়ালাইজযোগ্য?
নিউমানর

আমি ভাবতাম এটি কাজ করবে - স্ট্রিং জসন = সিরিয়ালাইজার।
দ্বাদশ 47

1
@ নিউমেনর হ্যাঁ, সেগুলি হয় তবে কেবল কী এবং মানটি টাইপ হয় string। আমি এখানে একটি উত্তর পোস্ট করেছি যার মধ্যে এটি অন্তর্ভুক্ত রয়েছে, যদি আপনি একবার দেখতে চান।
হাওলিনফুল

@ হাউলিনওয়াল্ফ আরও নির্ভুল হতে মানটি স্ট্রিং হতে হবে না। তবে কীটির জন্য এটি অবশ্যই কোনও প্রচ্ছদ হতে পারে না। স্ট্রিংগুলি কী হিসাবে সবচেয়ে ভাল কাজ করে।
জিউম ফক্স

1
@ টুয়েলভ 4747 এর সাথে কোনও লিঙ্কটি স্থানান্তরিত হওয়ার ক্ষেত্রে একটি নমুনা ব্যবহার অন্তর্ভুক্ত করা উচিত। অন্যথায় এই উত্তরটি অকেজো হয়ে উঠতে পারে, একদিন।
vapcguy

1

এটি অনেকগুলি বিভিন্ন লাইব্রেরি মনে হয় এবং যা আগের বছরগুলিতে এসেছিল এবং যা যায় বলে মনে হয় না। তবে ২০১ April সালের এপ্রিল পর্যন্ত, এই সমাধানটি আমার পক্ষে ভাল কাজ করেছে। স্ট্রিংগুলি সহজেই ints দ্বারা প্রতিস্থাপিত হয়

টি এল / ডিআর; আপনি এখানে এখানে এসেছেন যদি এটি অনুলিপি করুন:

    //outputfilename will be something like: "C:/MyFolder/MyFile.txt"
    void WriteDictionaryAsJson(Dictionary<string, List<string>> myDict, string outputfilename)
    {
        DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Dictionary<string, List<string>>));
        MemoryStream ms = new MemoryStream();
        js.WriteObject(ms, myDict); //Does the serialization.

        StreamWriter streamwriter = new StreamWriter(outputfilename);
        streamwriter.AutoFlush = true; // Without this, I've run into issues with the stream being "full"...this solves that problem.

        ms.Position = 0; //ms contains our data in json format, so let's start from the beginning
        StreamReader sr = new StreamReader(ms); //Read all of our memory
        streamwriter.WriteLine(sr.ReadToEnd()); // and write it out.

        ms.Close(); //Shutdown everything since we're done.
        streamwriter.Close();
        sr.Close();
    }

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

using System.Runtime.Serialization.Json;

আপনার অবশিষ্ট ব্যবহারের সাথে ফাইলের শীর্ষে, যাতে DataContractJsonSerializerক্লাসটি পাওয়া যায়। এই ব্লগ পোস্ট সিরিয়ালকরণের এই পদ্ধতি সম্পর্কে আরও তথ্য রয়েছে।

ডেটা ফর্ম্যাট (ইনপুট / আউটপুট)

আমার ডেটা 3 টি স্ট্রিং সহ একটি অভিধান, প্রতিটি স্ট্রিংয়ের তালিকার দিকে নির্দেশ করে। স্ট্রিংগুলির তালিকার দৈর্ঘ্য 3, 4 এবং 1 রয়েছে The

StringKeyofDictionary1 => ["abc","def","ghi"]
StringKeyofDictionary2 => ["String01","String02","String03","String04"]
Stringkey3 => ["someString"]

ফাইলটিতে লেখা আউটপুটটি এক লাইনে থাকবে, এখানে ফর্ম্যাট করা আউটপুট রয়েছে:

 [{
     "Key": "StringKeyofDictionary1",
     "Value": ["abc",
     "def",
     "ghi"]
 },
 {
     "Key": "StringKeyofDictionary2",
     "Value": ["String01",
     "String02",
     "String03",
     "String04",
 ]
 },
 {
     "Key": "Stringkey3",
     "Value": ["SomeString"]
 }]

0

এটি Merrit এর আগে যা পোস্ট করেছে তার অনুরূপ। শুধু সম্পূর্ণ কোড পোস্ট

    string sJSON;
    Dictionary<string, string> aa1 = new Dictionary<string, string>();
    aa1.Add("one", "1"); aa1.Add("two", "2"); aa1.Add("three", "3");
    Console.Write("JSON form of Person object: ");

    sJSON = WriteFromObject(aa1);
    Console.WriteLine(sJSON);

    Dictionary<string, string> aaret = new Dictionary<string, string>();
    aaret = ReadToObject<Dictionary<string, string>>(sJSON);

    public static string WriteFromObject(object obj)
    {            
        byte[] json;
            //Create a stream to serialize the object to.  
        using (MemoryStream ms = new MemoryStream())
        {                
            // Serializer the object to the stream.  
            DataContractJsonSerializer ser = new DataContractJsonSerializer(obj.GetType());
            ser.WriteObject(ms, obj);
            json = ms.ToArray();
            ms.Close();
        }
        return Encoding.UTF8.GetString(json, 0, json.Length);

    }

    // Deserialize a JSON stream to object.  
    public static T ReadToObject<T>(string json) where T : class, new()
    {
        T deserializedObject = new T();
        using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
        {

            DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedObject.GetType());
            deserializedObject = ser.ReadObject(ms) as T;
            ms.Close();
        }
        return deserializedObject;
    }

0

যদি আপনার প্রসঙ্গটি এটি (প্রযুক্তিগত বাধা ইত্যাদি) মঞ্জুরি দেয় তবে নিউটোনসফট.জসনJsonConvert.SerializeObject থেকে পদ্ধতিটি ব্যবহার করুন : এটি আপনার জীবনকে আরও সহজ করে তুলবে।

Dictionary<string, string> localizedWelcomeLabels = new Dictionary<string, string>();
localizedWelcomeLabels.Add("en", "Welcome");
localizedWelcomeLabels.Add("fr", "Bienvenue");
localizedWelcomeLabels.Add("de", "Willkommen");
Console.WriteLine(JsonConvert.SerializeObject(localizedWelcomeLabels));

// Outputs : {"en":"Welcome","fr":"Bienvenue","de":"Willkommen"}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.