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.