Bir C # nesnesini .NET'te bir JSON dizesine nasıl dönüştürebilirim?


944

Bunun gibi sınıflarım var:

class MyDate
{
    int year, month, day;
}

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

Ve böyle Ladbir JSON dizesine bir nesneyi açmak istiyorum:

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

(biçimlendirme olmadan). Bu bağlantıyı buldum , ancak .NET 4'te olmayan bir ad alanı kullanıyor . Ben de JSON.NET hakkında duydum , ama onların site şu anda kapalı gibi görünüyor ve harici DLL dosyaları kullanmaya meraklı değilim.

Manuel olarak bir JSON dizesi yazarı oluşturmanın yanı sıra başka seçenekler var mı?


2
JSON.net burada yüklenebilir Bir başka ve daha hızlı (dedikleri gibi - Ben kendim test etmedi) çözüm ServiceStack.Text Ben kendi JSON ayrıştırıcı haddeleme tavsiye etmem. Muhtemelen daha yavaş ve daha fazla hata eğilimli olacaktır veya çok zaman harcamanız gerekir.
— Zebi

Evet. C # JavaScriptSerializer adlı bir türü olan
— Glenn Ferrie'nin


2
Hm .. görebildiğim kadarıyla kullanabilmelisiniz: msdn.microsoft.com/en-us/library/… MSDN sayfasına göre .Net 4.0 da. Serialize (Object obj) yöntemini kullanabilmeniz gerekir: msdn.microsoft.com/en-us/library/bb292287.aspx Burada bir şey mi eksik? Btw. bağlantı bazı kod gibi görünüyor ve bir bağlantı değil
— Holger

System.Web.Xyz ad alanlarına bağımlılığı olmadığından bahsetmiyorum ...
— Dave Jellison

Yanıtlar:


898

JavaScriptSerializerSınıfı kullanabilirsiniz (başvuru ekleyin System.Web.Extensions):

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

Tam bir örnek:

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
Lütfen Microsoft'un bu çözüm yerine JSON.net kullanmanızı önerdiğini unutmayın. Bu cevabın uygunsuz olduğunu düşünüyorum. Willsteel'in cevabına bir göz atın. Kaynak: https://msdn.microsoft.com/tr-tr/library/system.web.script.serialization.javascriptserializer.aspx .
— rzelek

9
@DarinDimitrov, JSON.net hakkında bir ipucu eklemeyi düşünmelisiniz. Microsoft bunu JavascriptSerializer üzerinden öneriyor: msdn.microsoft.com/en-us/library/… Çerçeveye dahil yaklaşım olan msdn.microsoft.com/en-us/library/… adresine bir ipucu da ekleyebilirsiniz
— Mafii

Burada ise çevrimiçi araç sizin dönüştürmek classesiçin jsonbiçimi, umut birisi yardımcı olur.
— shaijut

6
Microsoft neden 3. taraf çözümlerini kendi önerileriyle öneriyor? Onların ifadeleri de çok garip: "Json.NET serileştirme ve serileştirme kullanılmalıdır. AJAX etkin uygulamalar için serileştirme ve serileştirme işlevselliği sağlar."
— Koruyucu bir

1
Sadece bir kafa yukarı, referans olarak System.Web.Extensions, sisteminizde olması ASP.NET AJAX 1.0veya ASP.NET 3.5kurulu olması gerekir . Lütfen bu stackoverflow.com/questions/7723489/…
— Sisir

1056

Hepimiz tek gömlekleri sevdiğimizden

... bu, popüler ve varsayılan serileştiriciden daha iyi olan Newtonsoft NuGet paketine bağlıdır.

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

Belgeler: JSON'un Serileştirilmesi ve Serisinin Kaldırılması


134
Newtonsoft serileştirici daha hızlıdır ve daha sonra özelleştirilebilir. Daha sonra kullanmanızı öneririz. Cevabınız için teşekkürler @willsteel
— Andrei

8
@JosefPfleger fiyatlandırma JSON.NET Şeması içindir, JSON.NET MIT
— David Cumps

1
Testlerim Newtonsoft'un JavaScriptSerializer sınıfından daha yavaş olduğunu gösterdi. (.NET 4.5.2)
— Nemke

31
JavaScriptSerializer için MSDN belgelerini okursanız, JSON.net kullanın diyor.
— dsghi

3
@JosefPfleger Newtionsoft JSON.net MIT lisanslıdır ... değişiklikler yapabilir ve istediğiniz gibi yeniden satabilirsiniz. Fiyatlandırma sayfası ticari teknik destek ve sahip oldukları bazı şema doğrulayıcılarla ilgilidir.
— cb88

95

Json.Net kullanın kütüphane, sen Nuget Paket Yöneticisi indirebilirsiniz.

Json Dizgisine Seri Hale Getirme:

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

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

Nesneye Silme İşlemini Kaldırma:

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

57

DataContractJsonSerializerSınıfı kullanın : MSDN1 , MSDN2 .

Örneğim : HERE .

Ayrıca, bir JSON dizesindeki nesneleri güvenli bir şekilde seriden kaldırabilir JavaScriptSerializer. Ama şahsen hala Json.NET'i tercih ediyorum .


1
Hala bu sayfada herhangi bir örnek görmüyorum , ancak burada MSDN'de ve başka yerlerde birkaçı var -> sonuncusu bir astar elde etmek için uzantı yöntemleri kullanıyor.
— Cristian Diaconescu

Oh, 2. MSDN bağlantısını kaçırdım :)
— Cristian Diaconescu

2
Düz sınıfları serileştirmez. Hata "DataContractAttribute özniteliğiyle işaretlemeyi ve DataMemberAttribute özniteliğiyle serileştirilmesini istediğiniz tüm üyelerini işaretlemeyi düşünün. Tür bir koleksiyonsa, bunu CollectionDataContractAttribute ile işaretlemeyi düşünün."
— Michael Freidgeim

@MichaelFreidgeim Bu doğru, serileştirmek istediğiniz sınıftaki özellikleri niteliklerle işaretlemeniz gerekiyor. DataContractAttribute DataMemberAttribute
— Edgar

1
@MichaelFreidgeim Hangisi daha iyi, gereksinimlere bağlıdır. Öznitelikler, özelliğin nasıl serileştirileceğini yapılandırmanıza olanak tanır.
— Edgar

24

Bunu Newtonsoft.json kullanarak yapabilirsiniz. NuGet'ten Newtonsoft.json'u yükleyin. Ve sonra:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

22

Wooou! Bir JSON çerçevesi kullanarak gerçekten daha iyi :)

İşte benim Json.NET ( http://james.newtonking.com/json ) kullanarak benim örnek :

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

Test:

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

Sonuç:

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

Şimdi JSON dizesini alan ve sınıfın alanlarını dolduran yapıcı yöntemini uygulayacağım.


1
İyi yazı, bunu yapmanın en güncel yolu bu.
— MatthewD

20

Ad System.Text.Jsonalanında yeni bir JSON serileştiricisi bulunmaktadır . .NET Core 3.0 paylaşılan çerçevesine dahildir ve .NET Standard veya .NET Framework veya .NET Core 2.x'i hedefleyen projeler için bir NuGet paketindedir .

Örnek kod:

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

Bu örnekte, serileştirilecek sınıflar alanlar yerine özelliklere sahiptir; System.Text.Jsonserileştirici şu anda serialize alanları yok.

Belgeler:


9

Çok büyük değillerse, büyük olasılıkla davanız JSON olarak dışa aktarılır.

Ayrıca bu, tüm platformlar arasında taşınabilir olmasını sağlar.

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

Bir ASP.NET MVC web denetleyicisindeyseniz:

string ladAsJson = Json(Lad);

Kimsenin bundan bahsetmediğine inanamıyorum.


1
Dize jsonresult döküm mümkün değil hakkında bir hata alıyorum.
— csga5000

Örtük yazmayla derlenir: var ladAsJson = Json (Lad).
— ewomack

3

ServiceStack'ın JSON Serializer'ı için oy verirdim:

using ServiceStack.Text

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

Ayrıca .NET için mevcut olan en hızlı JSON serileştiricisidir: http://www.servicestack.net/benchmarks/


4
Bunlar çok eski kriterler. Newtonsoft, ServiceStack ve JavaScriptSerializer'ın şu andaki üç sürümünü test ediyorum ve şu anda Newtonsoft en hızlısı. Hepsi oldukça hızlı.
— Michael Logutov

1
ServiceStack ücretsiz görünmüyor.
— joelnet

@joelnet şimdi durum böyle, ancak soruyu cevaplarken serbest kaldı. Ancak küçük siteler için ücretsizdir ve ücretli olmasına rağmen hala kullanıyorum, mükemmel bir çerçevedir.
— James

Buradaki bazı kriterler, kendi başına serileştirme olmasa da: docs.servicestack.net/real-world-performance
— JohnLBevan

3

XML'i JSON'a dönüştürmek için aşağıdaki kodu kullanın.

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

3

Bir C # sınıfı oluşturmak için şu araçları kullanın ve ardından nesnenizi serileştirmek için bu kodu kullanın:

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

3

Bu kadar kolaydır (dinamik nesneler için de çalışır (yazım nesnesi)):

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

web altında varsayılan komut dosyası yoktur. :(
— M


Ben bunu denedim ama hayır. Senaryo Ben referans olarak eklemeliyim sanırım. Çok teşekkürler
— M

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

Nesne

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

uygulama

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

Çıktı

{
  "AppSettings": {
    "DebugMode": false
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.