কীভাবে আমি সি # অবজেক্টটিকে। নেট এ জেএসএন স্ট্রিংয়ে পরিণত করব?


943

আমার এই জাতীয় ক্লাস রয়েছে:

class MyDate
{
    int year, month, day;
}

class Lad
{
    string firstName;
    string lastName;
    MyDate dateOfBirth;
}

এবং আমি একটি Ladবস্তুকে এই জাতীয় JSON স্ট্রিংয়ে রূপান্তর করতে চাই :

{
    "firstName":"Markoff",
    "lastName":"Chaney",
    "dateOfBirth":
    {
        "year":"1901",
        "month":"4",
        "day":"30"
    }
}

(বিন্যাস ছাড়াই) আমি এই লিঙ্কটি পেয়েছি , তবে এটি একটি নেট স্পেস ব্যবহার করে যা । নেট 4 এ নেই । আমি জেএসওএন.নেট সম্পর্কেও শুনেছি , তবে এই মুহুর্তে তাদের সাইটটি ডাউন ডাউন বলে মনে হচ্ছে এবং আমি বাহ্যিক ডিএলএল ফাইলগুলি ব্যবহার করতে আগ্রহী নই।

ম্যানুয়ালি একটি JSON স্ট্রিং রাইটার তৈরি করার পাশাপাশি কি অন্যান্য বিকল্প রয়েছে ?


2
JSON.net এখানে লোড করা যেতে পারে অন্য একটি এবং দ্রুত (তারা বলে যে - আমি এটি নিজেই পরীক্ষা করি নি) সমাধান হ'ল সার্ভিসস্ট্যাক T অনুগ্রহ করে আমি আপনার নিজের জেএসএন পার্সার রোল করার পরামর্শ দেব না would এটি সম্ভবত ধীর এবং আরও ত্রুটিযুক্ত হতে পারে বা আপনাকে প্রচুর সময় বিনিয়োগ করতে হবে।
জেবি

হ্যাঁ. সি # এর একটি প্রকার জাভা
স্ক্রিপ্টশিরাইজার


2
এইচএম .. যতদূর আমি দেখতে পাচ্ছি আপনি ব্যবহার করতে সক্ষম হবেন: এমএসডিএন.ইমক্রোসফটকম / en-us / library/… যা এমএসডিএন পৃষ্ঠা অনুসারে নেট নেট in.০ এও রয়েছে। আপনি সিরিয়ালাইজ (অবজেক্ট অবজেক্ট) পদ্ধতিটি ব্যবহার করতে সক্ষম হবেন: এমএসডিএন.মাইক্রোসফটকম /en-us/library/bb292287.aspx আমি কি এখানে কিছু মিস করছি? BTW। আপনার লিঙ্কটি কোনও লিঙ্ক নয় এমন কিছু কোড বলে মনে হচ্ছে
হলগার

এটির উল্লেখ করার দরকার নেই এটি সিস্টেমের উপর কোনও নির্ভরতা নেই e ওয়েব.জাইজ নামস্থানসমূহ ...
ডেভ জেলিসন

উত্তর:


897

আপনি JavaScriptSerializerক্লাসটি ব্যবহার করতে পারেন (এতে রেফারেন্স যুক্ত করুন System.Web.Extensions):

using System.Web.Script.Serialization;
var json = new JavaScriptSerializer().Serialize(obj);

একটি সম্পূর্ণ উদাহরণ:

using System;
using System.Web.Script.Serialization;

public class MyDate
{
    public int year;
    public int month;
    public int day;
}

public class Lad
{
    public string firstName;
    public string lastName;
    public MyDate dateOfBirth;
}

class Program
{
    static void Main()
    {
        var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = new JavaScriptSerializer().Serialize(obj);
        Console.WriteLine(json);
    }
}

95
মাইক্রোসফ্ট এই সমাধানের পরিবর্তে JSON.net ব্যবহার করার পরামর্শ দিচ্ছে তা মনে রাখবেন। আমি মনে করি যে এই উত্তরটি অনুপযুক্ত হয়ে গেছে। উইলস্টিলের উত্তরটি একবার দেখুন। সূত্র: https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
rzelek

9
@ ডারিনডিমিট্রভকে আপনার জেএসওএন.এন.টি. মাইক্রোসফট JavascriptSerializer ধরে বিশেষ পরামর্শ দেওয়া হচ্ছে: msdn.microsoft.com/en-us/library/... এছাড়াও আপনি একটি ইঙ্গিত যোগ করতে পারিনি msdn.microsoft.com/en-us/library/... যা ফ্রেমওয়ার্ক অন্তর্ভুক্ত পন্থা
Mafii

এখানে হয় অনলাইন সরঞ্জাম আপনার রূপান্তর করতে classesকরতে jsonফরম্যাট, আশা করি কেউ সাহায্য করে।
shaijut

6
মাইক্রোসফ্ট তাদের নিজস্ব থেকে তৃতীয় পক্ষের সমাধানের প্রস্তাব দিবে কেন? তাদের শব্দকোষটিও খুব অদ্ভুত: "জসন.এনইটি সিরিয়ালাইজেশন এবং ডিসরিয়ালাইজেশন ব্যবহার করা উচিত A
রক্ষক এক

1
উল্লেখ করার জন্য কেবল একটি মাথা আপ আপনার সিস্টেমে System.Web.Extensionsথাকতে হবে ASP.NET AJAX 1.0বা ASP.NET 3.5ইনস্টল করা উচিত । দয়া করে এই স্ট্যাকওভারফ্লো.com
সিসির

1053

যেহেতু আমরা সবাই ওয়ান-লাইনার পছন্দ করি

... এটি নিউটসনফট নুগেট প্যাকেজের উপর নির্ভর করে যা জনপ্রিয় এবং ডিফল্ট সিরিয়ালাইজারের চেয়ে ভাল।

Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})

ডকুমেন্টেশন: জেএসএনকে সিরিয়ালাইজিং এবং ডিজিজারাইজ করছে


134
নিউটসনফট সিরিয়ালাইজারটি দ্রুততর এবং মর কাস্টমাইজযোগ্য এরপরে বিল্ট ইন। এটি ব্যবহার করার জন্য উচ্চ প্রস্তাব দিন। @ উইলস্টিল উত্তরের জন্য ধন্যবাদ
Andrei

8
@ জোসেফফ্লেজারের মূল্য JSON.NET স্কিমা এর জন্য, JSON.NET নিয়মিত সিরিয়ালাইজার নয়, যা এমআইটি
ডেভিড কম্পস

1
আমার পরীক্ষায় দেখা গেছে যে নিউটোনসফট জাভাস্ক্রিপ্টশিরাইজার শ্রেণীর চেয়ে ধীর। (.NET 4.5.2)
নেমকে

31
আপনি যদি জাভাস্ক্রিপ্টশিরাইজারের জন্য এমএসডিএন ডকুমেন্টেশন পড়েন তবে এটি ফ্ল্যাট আউট বলেছে জেএসওএন.এন.
dsghi

3
@ জোসেফফ্লেগার নিউশনসফট জেএসএন নেট এমআইটি লাইসেন্সধারী ... আপনি যে পরিবর্তনগুলি চান তা পরিবর্তন করতে এবং এটি পুনরায় বিক্রয় করতে পারবেন। তাদের মূল্যের পৃষ্ঠাটি বাণিজ্যিক প্রযুক্তিগত সহায়তা এবং তাদের কাছে কিছু স্কিমা যাচাইকারী about
সিবি 88

95

জসন.নেট লাইব্রেরি ব্যবহার করুন , আপনি এটি নুগেট প্যাকেট পরিচালক থেকে ডাউনলোড করতে পারেন।

জেসন স্ট্রিংয়ে সিরিয়ালিং:

 var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };

var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

অবজেক্টের ডিসিরিয়াজিং:

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );

57

DataContractJsonSerializerক্লাসটি ব্যবহার করুন : এমএসডিএন 1 , এমএসডিএন 2

আমার উদাহরণ: এখানে

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


1
এখনও সেই পৃষ্ঠায় কোনও উদাহরণ দেখতে পাবেন না , তবে এখানে এমএসডিএন এবং অন্য কোথাও কিছু রয়েছে -> শেষটি ওয়ান-লাইনার অর্জনের জন্য এক্সটেনশন পদ্ধতি ব্যবহার করে।
ক্রিশ্চিয়ান ডায়াকোনসকু

ওহ, আমি ২ য় এমএসডিএন লিঙ্কটি মিস করেছি :)
ক্রিশ্চিয়ান ডায়াকোনস্কু

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

@ মিশেলফ্রেজিম এটি ঠিক, আপনি যে শ্রেণীর বৈশিষ্ট্যগুলি দিয়ে সিরিয়াল করতে চান তার বৈশিষ্ট্যগুলি চিহ্নিত করতে হবে। ডেটা কন্ট্রাক্টঅ্যাট্রিবিউট
এডগার

1
@ মিশেলফ্রিজেম যা প্রয়োজনের উপর নির্ভর করে তার থেকে ভাল। বৈশিষ্ট্যগুলি আপনাকে সম্পত্তি কীভাবে ক্রমিক করা হয় তা কনফিগার করতে দেয়।
এডগার

24

আপনি নিউটনসফট.জসন ব্যবহার করে এটি অর্জন করতে পারেন। নিউগেট থেকে নিউটনসফট.জসন ইনস্টল করুন। এবং তারপর:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

22

Wooou! সত্যিই আরও ভাল একটি JSON ফ্রেমওয়ার্ক ব্যবহার করে :)

Json.NET ( http://james.newtonking.com/json ) ব্যবহার করে আমার উদাহরণ এখানে :

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.IO;

namespace com.blogspot.jeanjmichel.jsontest.model
{
    public class Contact
    {
        private Int64 id;
        private String name;
        List<Address> addresses;

        public Int64 Id
        {
            set { this.id = value; }
            get { return this.id; }
        }

        public String Name
        {
            set { this.name = value; }
            get { return this.name; }
        }

        public List<Address> Addresses
        {
            set { this.addresses = value; }
            get { return this.addresses; }
        }

        public String ToJSONRepresentation()
        {
            StringBuilder sb = new StringBuilder();
            JsonWriter jw = new JsonTextWriter(new StringWriter(sb));

            jw.Formatting = Formatting.Indented;
            jw.WriteStartObject();
            jw.WritePropertyName("id");
            jw.WriteValue(this.Id);
            jw.WritePropertyName("name");
            jw.WriteValue(this.Name);

            jw.WritePropertyName("addresses");
            jw.WriteStartArray();

            int i;
            i = 0;

            for (i = 0; i < addresses.Count; i++)
            {
                jw.WriteStartObject();
                jw.WritePropertyName("id");
                jw.WriteValue(addresses[i].Id);
                jw.WritePropertyName("streetAddress");
                jw.WriteValue(addresses[i].StreetAddress);
                jw.WritePropertyName("complement");
                jw.WriteValue(addresses[i].Complement);
                jw.WritePropertyName("city");
                jw.WriteValue(addresses[i].City);
                jw.WritePropertyName("province");
                jw.WriteValue(addresses[i].Province);
                jw.WritePropertyName("country");
                jw.WriteValue(addresses[i].Country);
                jw.WritePropertyName("postalCode");
                jw.WriteValue(addresses[i].PostalCode);
                jw.WriteEndObject();
            }

            jw.WriteEndArray();

            jw.WriteEndObject();

            return sb.ToString();
        }

        public Contact()
        {
        }

        public Contact(Int64 id, String personName, List<Address> addresses)
        {
            this.id = id;
            this.name = personName;
            this.addresses = addresses;
        }

        public Contact(String JSONRepresentation)
        {
            //To do
        }
    }
}

পরীক্ষা:

using System;
using System.Collections.Generic;
using com.blogspot.jeanjmichel.jsontest.model;

namespace com.blogspot.jeanjmichel.jsontest.main
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<Address> addresses = new List<Address>();
            addresses.Add(new Address(1, "Rua Dr. Fernandes Coelho, 85", "15º andar", "São Paulo", "São Paulo", "Brazil", "05423040"));
            addresses.Add(new Address(2, "Avenida Senador Teotônio Vilela, 241", null, "São Paulo", "São Paulo", "Brazil", null));

            Contact contact = new Contact(1, "Ayrton Senna", addresses);

            Console.WriteLine(contact.ToJSONRepresentation());
            Console.ReadKey();
        }
    }
}

ফলাফল:

{
  "id": 1,
  "name": "Ayrton Senna",
  "addresses": [
    {
      "id": 1,
      "streetAddress": "Rua Dr. Fernandes Coelho, 85",
      "complement": "15º andar",
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": "05423040"
    },
    {
      "id": 2,
      "streetAddress": "Avenida Senador Teotônio Vilela, 241",
      "complement": null,
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": null
    }
  ]
}

এখন আমি কনস্ট্রাক্টর পদ্ধতিটি প্রয়োগ করব যা একটি JSON স্ট্রিং গ্রহণ করবে এবং শ্রেণীর ক্ষেত্রগুলিকে জনবসতি করবে।


1
ভাল পোস্ট, এটি করার সর্বাধিক বর্তমান উপায়।
ম্যাথুডি

20

System.Text.Jsonনেমস্পেসে একটি নতুন জেএসএন সিরিয়ালাইজার উপলব্ধ । এটি .NET কোর 3.0 ভাগ করে নেওয়া কাঠামোর অন্তর্ভুক্ত এবং একটি নিউগেট প্যাকেজে রয়েছে প্রকল্পগুলির জন্য যা .NET স্ট্যান্ডার্ড বা। নেট ফ্রেমওয়ার্ক বা। নেট কোর 2.x. টার্গেট করে target

উদাহরণ কোড:

using System;
using System.Text.Json;

public class MyDate
{
    public int year { get; set; }
    public int month { get; set; }
    public int day { get; set; }
}

public class Lad
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public MyDate DateOfBirth { get; set; }
}

class Program
{
    static void Main()
    {
        var lad = new Lad
        {
            FirstName = "Markoff",
            LastName = "Chaney",
            DateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = JsonSerializer.Serialize(lad);
        Console.WriteLine(json);
    }
}

এই উদাহরণে সিরিয়ালযুক্ত করা ক্লাসগুলির ক্ষেত্রের পরিবর্তে বৈশিষ্ট্য রয়েছে; দ্যSystem.Text.Jsonserializer বর্তমানে ধারাবাহিকভাবে ক্ষেত্র আছে।

ডকুমেন্টেশন:


9

যদি সেগুলি খুব বড় না হয় তবে সম্ভবত আপনার ক্ষেত্রে এটি JSON হিসাবে রফতানি করে।

এছাড়াও এটি এটি সমস্ত প্ল্যাটফর্মের মধ্যে বহনযোগ্য করে তোলে।

using Newtonsoft.Json;

[TestMethod]
public void ExportJson()
{
    double[,] b = new double[,]
        {
            { 110,  120,  130,  140, 150 },
            {1110, 1120, 1130, 1140, 1150},
            {1000,    1,   5,     9, 1000},
            {1110,    2,   6,    10, 1110},
            {1220,    3,   7,    11, 1220},
            {1330,    4,   8,    12, 1330}
        };

    string jsonStr = JsonConvert.SerializeObject(b);

    Console.WriteLine(jsonStr);

    string path = "X:\\Programming\\workspaceEclipse\\PyTutorials\\src\\tensorflow_tutorials\\export.txt";

    File.WriteAllText(path, jsonStr);
}

8

আপনি যদি একটি এএসপি.নেট এমভিসি ওয়েব কন্ট্রোলারে থাকেন তবে এটি এতটা সহজ:

string ladAsJson = Json(Lad);

কেউ এটি উল্লেখ করেনি বিশ্বাস করতে পারে না।


1
স্ট্রিংতে jsonresult কাস্ট করতে না পারার বিষয়ে আমি একটি ত্রুটি পেয়েছি।
csga5000

এটি অন্তর্নিহিত টাইপিংয়ের সাথে সংকলন করবে: var ladAsJson = Json (ল্যাড)।
ewomack

3

আমি সার্ভিসস্ট্যাকের জেএসএন সিরিয়ালাইজারকে ভোট দেব:

using ServiceStack.Text

string jsonString = new { FirstName = "James" }.ToJson();

এটি নেট। Http://www.servicestack.net/benchmark/ এর জন্য দ্রুততম জেএসএন সিরিয়ালাইজার উপলব্ধ available


4
সেগুলি সেখানে খুব পুরানো মানদণ্ড। আমি কেবল নিউটনসফট, সার্ভিসস্ট্যাক এবং জাভাস্ক্রিপ্টসরিয়ালাইজের তিনটি বর্তমান সংস্করণ পরীক্ষা করেছি এবং বর্তমানে নিউটনসফট সবচেয়ে দ্রুততম। থো তারা সবাই বেশ দ্রুত করে।
মাইকেল লগুতভ

1
সার্ভিস স্ট্যাকটি নিখরচায় প্রদর্শিত হবে না।
jelelnet

@ জেলনেট এটি এখন কেস, তবে প্রশ্নের উত্তর দেওয়ার সময় এটি মুক্ত ছিল। তবে এটি ছোট সাইটগুলির জন্য বিনামূল্যে এবং এটি প্রদান করা সত্ত্বেও আমি এটি ব্যবহার করছি, এটি একটি দুর্দান্ত কাঠামো।
জেমস

এখানে কিছু মানদণ্ড রয়েছে, যদিও নিজস্বভাবে
রিয়েল পারফরম্যান্স এলবেভান

3

এক্সএমএলকে জেএসনে রূপান্তর করার জন্য নীচের কোডটি ব্যবহার করুন।

var json = new JavaScriptSerializer().Serialize(obj);


3

এটি এটির মতো সহজ (এটি গতিশীল বস্তুর জন্যও (টাইপ অবজেক্ট)) কাজ করে:

string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);

ওয়েবের অধীনে কোনও ডিফল্ট স্ক্রিপ্ট নেই। :(
এম

আপনি এটি সন্ধান করছেন: এমএসডিএন.মাইক্রোসফটকম
en

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

0

Serializer

 public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
        var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite, new JsonSerializerSettings
        {
            Formatting = Formatting.Indented,
        });
        using (var writer = new StreamWriter(filePath, append))
        {
            writer.Write(contentsToWriteToFile);
        }
}

উদ্দেশ্য

namespace MyConfig
{
    public class AppConfigurationSettings
    {
        public AppConfigurationSettings()
        {
            /* initialize the object if you want to output a new document
             * for use as a template or default settings possibly when 
             * an app is started.
             */
            if (AppSettings == null) { AppSettings=new AppSettings();}
        }

        public AppSettings AppSettings { get; set; }
    }

    public class AppSettings
    {
        public bool DebugMode { get; set; } = false;
    }
}

বাস্তবায়ন

var jsonObject = new AppConfigurationSettings();
WriteToJsonFile<AppConfigurationSettings>(file.FullName, jsonObject);

আউটপুট

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