জেএসএন-তে একটি তালিকা সিরিয়ালাইজ করা হচ্ছে


182

আমার কাছে একটি অবজেক্ট মডেল রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

public MyObjectInJson
{
   public long ObjectID {get;set;}
   public string ObjectInJson {get;set;}
}

সম্পত্তিটি ObjectInJsonইতিমধ্যে ক্রমিক সংস্করণ এমন একটি বস্তু যা নেস্টেড তালিকাগুলি ধারণ করে। এই মুহুর্তের জন্য, আমি MyObjectInJsonম্যানুয়ালি এই তালিকাটির তালিকা ক্রমিক করছি :

StringBuilder TheListBuilder = new StringBuilder();

TheListBuilder.Append("[");
int TheCounter = 0;

foreach (MyObjectInJson TheObject in TheList)
{
  TheCounter++;
  TheListBuilder.Append(TheObject.ObjectInJson);

  if (TheCounter != TheList.Count())
  {
    TheListBuilder.Append(",");
  }
}
TheListBuilder.Append("]");

return TheListBuilder.ToString();

আমি ভাবছি যদি আমি এই ধরণের বিপজ্জনক কোডটি প্রতিস্থাপন করতে পারি JavascriptSerializerএবং একই ফলাফল পেতে পারি। আমি এই কিভাবে করব?

ধন্যবাদ।


নোট করুন যে কোনও ডব্লিউপিএফ প্রকল্পে, আপনাকে System.Web.Extensionsব্যবহারের জন্য একটি রেফারেন্স যুক্ত করতে হবে System.Web.Script.Serialization: stackoverflow.com/a/18746092/1599699 stackoverflow.com/a/19299695/1599699
অ্যান্ড্রু

উত্তর:


337

নেট কোর 3.0.০ বা তার পরে ব্যবহার করা হয়;

বিল্ট ইন System.Text.Jsonপার্সার বাস্তবায়নে ডিফল্ট ।

যেমন

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);

অন্যথায়, অন্যান্য, কম মূলধারার অপশন মত পাওয়া যায় Utf8Json পার্সার এবং Jil : এই প্রস্তাব দিতে পারে উচ্চতর কর্মক্ষমতা , যদি আপনি সত্যিই এটা প্রয়োজন কিন্তু, আপনি তাদের নিজ নিজ প্যাকেজগুলি ইনস্টল করতে হবে।

যদি নেট কোর 2.2 বা তার আগেরটি ব্যবহার করে আটকে থাকে;

আপনার প্রথম পছন্দ জেএসএন পার্সার হিসাবে নিউটনসফট জেএসএন.নেট ব্যবহার করতে ডিফল্ট।

যেমন

using Newtonsoft.Json;

var json = JsonConvert.SerializeObject(aList);

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

PM> Install-Package Newtonsoft.Json

আরও তথ্যের জন্য উত্তরটি দেখুন এবং এই তথ্যটির উত্স এটি আপভোট করুন

কেবলমাত্র রেফারেন্সের জন্য, বহু বছর আগে এটিই মূল উত্তর ছিল;

// you need to reference System.Web.Extensions

using System.Web.Script.Serialization;

var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(aList);

1
আহ ঠিক আছে, এটি কেবলমাত্র বস্তুগুলির নিজেরাই নয় বরং বস্তুর তালিকাগুলিও ক্রমিক করে তোলে। ধন্যবাদ।
ফরাসি

চক্রীয় সম্পর্ক পছন্দ করে না তবে এটি এখানে কোনও সমস্যা নয়
Jodrell

13
মনে রাখবেন যে এই নেমস্পেসটি চূড়ান্তভাবে সিস্টেমে টুকটাকভাবে দূরে রয়েছে। আপনি একবার এটি উল্লেখ হিসাবে যুক্ত করলে সমাধানটি দুর্দান্তভাবে কাজ করে!
আট-বিট গুরু

1
আমি আপনার সম্পাদিত উত্তরটি দেখতে পাচ্ছি এবং সত্যই কামনা করছি আমার কাছে একটি আপডেট হওয়া উদাহরণ রয়েছে।
ডিলান ব্র্যামস 21

1
@ IamNumber5 ইতিমধ্যে অন্য উত্তরে সরবরাহ করা হয়েছে। আমি যাইহোক আমার উত্তর প্রসারিত।
জোডরেল

111

আপনি Json.NET ব্যবহার করতে পারেন। কেবল এটি http://james.newtonking.com/pages/json-net.aspx এ ডাউনলোড করুন, সংক্ষেপিত ফাইলটি বের করুন এবং এটি একটি রেফারেন্স হিসাবে যুক্ত করুন।

তারপরে নিম্নলিখিতটি দিয়ে কেবল তালিকাটি সিরিয়ালিয়াল করুন (বা যা কিছু বস্তু আপনি চান):

using Newtonsoft.Json;

string json = JsonConvert.SerializeObject(listTop10);

আপডেট: আপনি এটিকে নুগেট প্যাকেজ ম্যানেজারের মাধ্যমে আপনার প্রকল্পে যুক্ত করতে পারেন (সরঞ্জাম -> নিউগেট প্যাকেজ ম্যানেজার -> প্যাকেজ ম্যানেজার কনসোল):

PM> Install-Package Newtonsoft.Json

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


11

অন্তর্নির্মিত জেএসএন সিরিয়ালাইজারগুলির সাথে এটি করার দুটি সাধারণ উপায় রয়েছে:

  1. JavaScriptSerializer

    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(TheList);
  2. DataContractJsonSerializer

    var serializer = new DataContractJsonSerializer(TheList.GetType());
    using (var stream = new MemoryStream())
    {
        serializer.WriteObject(stream, TheList);
        using (var sr = new StreamReader(stream))
        {
            return sr.ReadToEnd();
        }
    }

    দ্রষ্টব্য, এই বিকল্পটির জন্য আপনার শ্রেণীর জন্য ডেটা চুক্তির সংজ্ঞা প্রয়োজন:

    [DataContract]
    public class MyObjectInJson
    {
       [DataMember]
       public long ObjectID {get;set;}
       [DataMember]
       public string ObjectInJson {get;set;}
    }

5
public static string JSONSerialize<T>(T obj)
        {
            string retVal = String.Empty;
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                serializer.WriteObject(ms, obj);
                var byteArray = ms.ToArray();
                retVal = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
            }
            return retVal;
        }

4

.NET ইতিমধ্যে সিস্টেম.রুনটাইম.সরিয়ালাইজেশন.জসন নেমস্পেস এবং ডেটা কন্ট্র্যাক্ট জসনসিরাইজার ক্লাসের মাধ্যমে 3.5 এর সংস্করণ থেকে বেসিক জসন সিরিয়ালাইজেশন সমর্থন করে । নামটি থেকে বোঝা যায়, চূড়ান্ত জসন আউটপুট তৈরি করতে আপনার অবজেক্টগুলিতে আপনি যে কোনও ডেটা টীকা যুক্ত করেন তা ডেটা কন্ট্রাক্ট জসনসিরাইজার অ্যাকাউন্টে গ্রহণ করে।

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

নিম্নলিখিত কোডটি সিরিজটি কনসোল আউটপুট স্ট্রিমের একটি তালিকা রয়েছে। আপনি দেখতে পাচ্ছেন এটি Json.NET এর চেয়ে কিছুটা বেশি ভার্জোজ এবং টাইপ-সেফ নয় (অর্থাত্ জেনারিক নেই)

        var list = new List<string> {"a", "b", "c", "d"};

        using(var output = Console.OpenStandardOutput())                
        {                
            var writer = new DataContractJsonSerializer(typeof (List<string>));
            writer.WriteObject(output,list);
        }

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

আর একটি বিকল্প হ'ল সার্ভিসস্ট্যাক.অধিকার , সার্ভিকস্ট্যাকের অংশ ... স্ট্যাক, যা জসন, জেএসভি এবং সিএসভির জন্য খুব দ্রুত সিরিয়ালাইজের একটি সেট সরবরাহ করে।


0

অন্য পোস্টিংয়ের উত্তরের উপর ভিত্তি করে .. আমি জেসন.এনইটি সংস্করণ 12.x এর সাথে গতিশীল পুনরুদ্ধারটি ব্যবহার করে একটি তালিকা তৈরি করার আরও সাধারণ উপায় নিয়ে এসেছি 12.

using Newtonsoft.Json;

static class JsonObj
{
    /// <summary>
    /// Deserializes a json file into an object list
    /// Author: Joseph Poirier 2/26/2019
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static List<T> DeSerializeObject<T>(string fileName)
    {
        List<T> objectOut = new List<T>();

        if (string.IsNullOrEmpty(fileName)) { return objectOut; }

        try
        {
            // reading in full file as text
            string ss = File.ReadAllText(fileName);

            // went with <dynamic> over <T> or <List<T>> to avoid error..
            //  unexpected character at line 1 column 2
            var output = JsonConvert.DeserializeObject<dynamic>(ss);

            foreach (var Record in output)
            {
                foreach (T data in Record)
                {
                    objectOut.Add(data);
                }
            }
        }
        catch (Exception ex)
        {
            //Log exception here
            Console.Write(ex.Message);
        }

        return objectOut;
    }
}

প্রক্রিয়া কল

{
        string fname = "../../Names.json"; // <- your json file path

        // for alternate types replace string with custom class below
        List<string> jsonFile = JsonObj.DeSerializeObject<string>(fname);
}

বা এই কল প্রক্রিয়া

{
        string fname = "../../Names.json"; // <- your json file path

        // for alternate types replace string with custom class below
        List<string> jsonFile = new List<string>();
        jsonFile.AddRange(JsonObj.DeSerializeObject<string>(fname));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.