.NET හි C # වස්තුවක් JSON නූලක් බවට පත් කරන්නේ කෙසේද?


966

මට මේ වගේ පන්ති තියෙනවා:

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"
    }
}

(හැඩතල ගැන්වීමකින් තොරව). මට මෙම සබැඳිය හමු විය , නමුත් එය .NET 4 හි නොමැති නාම අවකාශයක් භාවිතා කරයි . මම JSON.NET ගැන ද අසා ඇත්තෙමි , නමුත් ඔවුන්ගේ වෙබ් අඩවිය මේ වන විට අක්‍රිය වී ඇති බව පෙනේ, බාහිර ඩීඑල්එල් ගොනු භාවිතා කිරීමට මා උනන්දු නොවේ.

JSON සංගීත ලේඛකයෙකු අතින් නිර්මාණය කිරීම හැර වෙනත් විකල්ප තිබේද?


2
JSON.net මෙහි පැටවිය හැකිය වෙනත් හා වේගවත් (ඔවුන් පවසන පරිදි - මම එය මා විසින්ම පරීක්‍ෂා නොකළේ) විසඳුම ServiceStack.Text ඔබේම JSON විග්‍රහකය පෙරළීමට මම නිර්දේශ නොකරමි. එය මන්දගාමී හා වඩා දෝෂ සහිත විය හැකි හෝ ඔබට බොහෝ කාලයක් ආයෝජනය කිරීමට සිදුවේ.
Zebi

ඔව්. C # හි ජාවාස්ක්‍රිප්ට්
සීරියලයිසර්


2
හ්ම් .. මට පෙනෙන පරිදි ඔබට භාවිතා කළ හැකි විය යුතුය: msdn.microsoft.com/en-us/library/… එම්එස්ඩීඑන් පිටුවට අනුව .නෙට් 4.0 හි ද ඇත. ඔබට Serialize (Object obj) ක්‍රමය භාවිතා කළ හැකිය: msdn.microsoft.com/en-us/library/bb292287.aspx මට මෙහි යමක් මග හැරී තිබේද? Btw. ඔබ සම්බන්ධ කිරීම කිසියම් කේතයක් මිස සබැඳියක් නොවන බව පෙනේ
හොල්ගර්

එයට System.Web.Xyz නාම අවකාශයන් මත කිසිදු පරායත්තතාවයක් නොමැති බව සඳහන් නොකල යුතුය ...
ඩේව් ජෙලිසන්

Answers:


910

ඔබට 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);
    }
}

99
මෙම විසඳුම වෙනුවට JSON.net භාවිතා කිරීමට මයික්‍රොසොෆ්ට් යෝජනා කරන බව කරුණාකර මතක තබා ගන්න. මෙම පිළිතුර නුසුදුසු යැයි මම සිතමි. විල්ස්ටීල්ගේ පිළිතුර දෙස බලන්න. මුලාශ්‍රය: https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx .
rzelek

9
ArDarinDimitrov ඔබ JSON.net ගැන ඉඟියක් එක් කිරීම ගැන සලකා බැලිය යුතුය. මයික්රොසොෆ්ට් JavascriptSerializer පුරා එය නිර්දේශ කරයි: msdn.microsoft.com/en-us/library/... ඔබ ද ඉඟියක් එකතු කළ හැකි ය msdn.microsoft.com/en-us/library/... රාමුව ඇතුළත් ප්රවේශය වන
Mafii

මෙහි වේ සමඟ අමුත්තන් මෙවලමක් ඔබේ බවට පරිවර්තනය කිරීමට classesකිරීමට jsonආකෘතිය, බලාපොරොත්තුව කෙනෙකුට උපකාරී වේ.
shaijut

6
මයික්‍රොසොෆ්ට් තෙවන පාර්ශවීය විසඳුමක් තමන් විසින්ම නිර්දේශ කරන්නේ ඇයි? ඔවුන්ගේ වචන ද ඉතා අමුතු ය: "Json.NET අනුක්‍රමිකකරණය සහ ආසියානුකරණය භාවිතා කළ යුතුය. AJAX- සක්‍රීය කරන ලද යෙදුම් සඳහා අනුක්‍රමිකකරණය සහ ඩෙසරීකරණය කිරීමේ ක්‍රියාකාරිත්වය සපයයි."
ආරක්ෂකයා

1
හුදෙක් හිස්, සඳහන් කිරීමට System.Web.Extensions, ඔබ සතුව ASP.NET AJAX 1.0හෝ ASP.NET 3.5ඔබේ පද්ධතිය මත ස්ථාපනය කරන ලදි. කරුණාකර මෙම බලන්න stackoverflow.com/questions/7723489/...
Sisir

1088

අපි හැමෝම එක ලයිනර් වලට ආදරෙයි

... මෙය නිව්ටන්සොෆ්ට් නුජෙට් පැකේජය මත රඳා පවතී, එය ජනප්‍රිය සහ පෙරනිමි අනුක්‍රමිකකරණයට වඩා හොඳය.

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

ප්‍රලේඛනය: JSON අනුක්‍රමිකකරණය සහ ඩෙසියරලයිසින් කිරීම


137
නිව්ටන්සොෆ්ට් අනුක්‍රමිකකරණය වේගවත් වන අතර පසුව අභිරුචිකරණය කළ හැකිය. එය භාවිතා කිරීමට ඉහළින්ම නිර්දේශ කරන්න. පිළිතුරට ස්තූතියි @ විල්ස්ටීල්
ඇන්ඩ්‍රි

9
Ose ජොසෙෆ්ෆ්ලෙගර් මිල නියම කරන්නේ JSON.NET යෝජනා ක්‍රමයට මිස JSON.NET නිත්‍ය අනුක්‍රමිකකාරකය වන MIT
ඩේවිඩ් කම්ප්ස්

1
මගේ පරීක්ෂණයෙන් පෙන්නුම් කළේ නිව්ටන්සොෆ්ට් ජාවාස්ක්‍රිප්ට් සීරියලයිසර් පන්තියට වඩා මන්දගාමී බවයි. (.නෙට් 4.5.2)
නෙම්කේ

31
ඔබ JavaScriptSerializer සඳහා MSDN ප්‍රලේඛනය කියවන්නේ නම් , එය JSON.net භාවිතා කරන්න.
dsghi

3
@JosefPfleger Newtionsoft JSON.net MIT බලපත්‍රලාභීයි ... ඔබට වෙනස් කිරීම් සිදු කර ඔබට අවශ්‍ය පරිදි එය නැවත විකිණීමට හැකිය. ඔවුන්ගේ මිලකරණ පිටුව වාණිජ තාක්ෂණික සහාය සහ ඔවුන් සතුව ඇති සමහර ක්‍රමාංකන වලංගු කරන්නන් ය.
cb88

101

Json.Net පුස්තකාලය භාවිතා කරන්න , ඔබට එය Nuget Packet Manager වෙතින් බාගත හැකිය.

Json String වෙත අනුක්‍රමික කිරීම:

 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 );

59

DataContractJsonSerializerපන්තිය භාවිතා කරන්න : MSDN1 , MSDN2 .

මගේ උදාහරණය: මෙතැන .

එය මෙන් නොව, JSON නූලකින් වස්තූන් ආරක්ෂිතව අවතක්සේරු කළ හැකිය JavaScriptSerializer. නමුත් පෞද්ගලිකව මම තවමත් Json.NET වලට කැමතියි .


2
තවමත් එම පිටුවේ කිසිදු උදාහරණ නොපෙනේ , නමුත් මෙහි සමහරක් එම්එස්ඩීඑන් සහ වෙනත් තැන්වල ඇත -> අන්තිමයා එක් ලයිනර් සාක්ෂාත් කර ගැනීම සඳහා දිගු ක්‍රම භාවිතා කරයි.
ක්‍රිස්ටියන් ඩයකොනෙස්කු

ඔහ්, මට 2 වන MSDN සබැඳිය මග හැරුණි :)
ක්‍රිස්ටියන් ඩයකොනෙස්කු

2
එය සරල පන්ති අනුක්‍රමික නොකරයි. දෝෂය වාර්තා වී ඇත්තේ "එය ඩේටාකොන්ට්‍රැක්ට් ඇට්‍රිබියුට් ගුණාංගය සමඟ සලකුණු කිරීම සහ එහි සියලුම සාමාජිකයන් ඩේටා මෙම්බර් ඇට්‍රිබියුට් ගුණාංගය සමඟ අනුක්‍රමිකව සලකුණු කිරීම සලකා බලන්න. වර්ගය එකතුවක් නම්, එය එකතු කිරීමේ දත්ත කොන්ත්‍රාත්තුව සමඟ ලකුණු කිරීම සලකා බලන්න."
මයිකල් ෆ්‍රයිඩ්ජිම්

IcMichaelFreidgeim එය හරි, ඔබට ගුණාංග සමඟ අනුක්‍රමික කිරීමට අවශ්‍ය පන්තියේ ගුණාංග සලකුණු කළ යුතුය. DataContractAttribute DataMemberAttribute
එඩ්ගර්

1
IcMichaelFreidgeim වඩා හොඳ වන්නේ අවශ්‍යතා මත රඳා පවතී. ගුණාංග අනුක්‍රමික කර ඇති ආකාරය වින්‍යාස කිරීමට ගුණාංග ඔබට ඉඩ දෙයි.
එඩ්ගර්

26

Newtonsoft.json භාවිතා කිරීමෙන් ඔබට මෙය සාක්ෂාත් කරගත හැකිය. NuGet වෙතින් Newtonsoft.json ස්ථාපනය කරන්න. ඊළගට:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

23

වෝ! 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
හොඳ පෝස්ට්, මෙය කිරීමට වඩාත්ම වර්තමාන ක්‍රමය මෙයයි.
මතෙව්

22

System.Text.Jsonනාම අවකාශයේ නව JSON අනුක්‍රමිකයක් ලබා ගත හැකිය . එය .NET Core 3.0 හවුල් රාමුවට ඇතුළත් කර ඇති අතර .NET Standard හෝ .NET Framework හෝ .NET Core 2.x ඉලක්ක කරගත් ව්‍යාපෘති සඳහා NuGet පැකේජයක ඇත.

උදාහරණ කේතය:

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 දැනට ක්ෂේත්ර serialize නැත.

ප්‍රලේඛනය:


10

ඒවා ඉතා විශාල නොවේ නම්, බොහෝ විට ඔබේ නඩුව එය 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

ඔබ ASP.NET MVC වෙබ් පාලකයක සිටී නම් එය එතරම්ම සරල ය:

string ladAsJson = Json(Lad);

කිසිවෙකු මේ ගැන සඳහන් කර ඇතැයි විශ්වාස කළ නොහැක.


1
Jsonresult නූලට දැමීමට නොහැකි වීම ගැන මට දෝෂයක් ඇතිවිය.
csga5000

එය ව්‍යංග ටයිප් කිරීම සමඟ සම්පාදනය කරනු ඇත: var ladAsJson = Json (ලාඩ්).
ewomack

5

මම සර්විස්ටැක් හි JSON Serializer සඳහා ඡන්දය දෙන්නෙමි:

using ServiceStack;

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

.NET සඳහා ලබා ගත හැකි වේගවත්ම JSON අනුක්‍රමිකකරණය ද එයයි: http://www.servicestack.net/benchmarks/


4
ඒවා එහි ඉතා පැරණි මිණුම් සලකුණු වේ. මම නිව්ටන්සොෆ්ට්, සර්විස්ටැක් සහ ජාවාස්ක්‍රිප්ට් සීරියලයිසර් හි වර්තමාන අනුවාද තුනම පරීක්ෂා කර ඇති අතර දැනට නිව්ටන්සොෆ්ට් වේගවත්ම වේ. ඔවුන් සියල්ලෝම ඉතා වේගයෙන් කරති.
මයිකල් ලොගුටොව්

1
සර්විස්ටැක් නොමිලේ නොවන බව පෙනේ.
joelnet

1
@ ජොයෙල්නෙට් දැන් මෙයයි, නමුත් ප්‍රශ්නයට පිළිතුරු දෙන විට එය නොමිලේ විය. කෙසේ වෙතත් එය කුඩා වෙබ් අඩවි සඳහා නොමිලේ වන අතර, එය ගෙවා ඇතත් මම එය තවමත් භාවිතා කරමි, එය විශිෂ්ට රාමුවකි.
ජේම්ස්

මෙහි සමහර මිණුම් සලකුණු, අනුක්‍රමිකකරණය සඳහා තනිවම නොමැති වුවද: docs.servicestack.net/real-world-performance
JohnLBevan

1
el ජොයෙල්නෙට් දැන් නිදහස් බව පෙනේ. ඔවුන් එය වෙනස් කළේ කවදාදැයි නොදනී.
Aage


4

එය මේ තරම් පහසු ය (එය ගතික වස්තු සඳහා ද ක්‍රියා කරයි (වස්තුව ටයිප් කරන්න)):

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

වෙබය යටතේ පෙරනිමි ස්ක්‍රිප්ට් නොමැත. :(
එම්

ඔබ මෙය සොයන්නේ: msdn.microsoft.com/en-us/library/…
MarzSocks

මම එය උත්සාහ කළ නමුත් නැත. ස්ක්‍රිප්ට් මම එය යොමු කිරීමක් ලෙස එකතු කළ යුතු යැයි අනුමාන කරමි. ඉතින් ගොඩක් ස්තූතියි
එම්

3

XML JSON බවට පරිවර්තනය කිරීම සඳහා පහත කේතය භාවිතා කරන්න.

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

0

අනුක්‍රමික

 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
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.