Bagaimana cara mengubah objek C # menjadi string JSON di .NET?

944

Saya memiliki kelas seperti ini:

class MyDate
{
    int year, month, day;
}

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

Dan saya ingin mengubah Ladobjek menjadi string JSON seperti ini:

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

(tanpa format). Saya menemukan tautan ini , tetapi menggunakan namespace yang tidak ada dalam .NET 4 . Saya juga mendengar tentang JSON.NET , tetapi situs mereka tampaknya turun saat ini, dan saya tidak tertarik menggunakan file DLL eksternal.

Apakah ada opsi lain selain membuat penulis string JSON secara manual ?

Hui
sumber
2
JSON.net dapat dimuat di sini Solusi lain dan lebih cepat (seperti yang mereka katakan - saya tidak mengujinya sendiri) adalah ServiceStack.Text Saya tidak akan merekomendasikan untuk menggulir parser JSON Anda sendiri. Kemungkinan akan lebih lambat dan lebih rentan kesalahan atau Anda harus menginvestasikan banyak waktu.
Zebi
Iya. C # memiliki jenis yang disebut JavaScriptSerializer
Glenn Ferrie
kemungkinan duplikat Generics / JSON JavaScriptSerializer C #
Filip Ekberg
2
Hm .. sejauh yang saya bisa lihat Anda harus dapat menggunakan: msdn.microsoft.com/en-us/library/… Yang juga dalam .Net 4.0 menurut halaman MSDN. Anda harus dapat menggunakan metode Serialize (Object obj): msdn.microsoft.com/en-us/library/bb292287.aspx Apakah saya kehilangan sesuatu di sini? Btw. tautan Anda tampaknya merupakan beberapa kode dan bukan tautan
Holger
Belum lagi tidak memiliki ketergantungan pada namespace System.Web.Xyz ...
Dave Jellison

Jawaban:

899

Anda dapat menggunakan JavaScriptSerializerkelas (tambahkan referensi ke System.Web.Extensions):

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

Contoh lengkap:

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);
    }
}
Darin Dimitrov
sumber
95
Harap diingat bahwa Microsoft menyarankan untuk menggunakan JSON.net alih-alih solusi ini. Saya pikir jawaban ini menjadi tidak pantas. Lihatlah jawaban willsteel. Sumber: https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx .
rzelek
9
@DarinDimitrov Anda harus mempertimbangkan untuk menambahkan petunjuk tentang JSON.net. Microsoft merekomendasikannya melalui JavascriptSerializer: msdn.microsoft.com/en-us/library/… Anda juga bisa menambahkan petunjuk ke msdn.microsoft.com/en-us/library/… yang merupakan kerangka kerja termasuk pendekatan
Mafii
di sini adalah alat online untuk mengkonversi Anda classeske jsonformat yang, harapan membantu seseorang.
shaijut
6
Mengapa Microsoft merekomendasikan solusi pihak ke-3 atas solusi mereka? Kata-kata mereka juga sangat aneh: "Json.NET harus menggunakan serialisasi dan deserialisasi. Menyediakan fungsionalitas serialisasi dan deserialisasi untuk aplikasi yang mendukung AJAX."
Pelindung satu
1
Untuk informasi lebih lanjut System.Web.Extensions, Anda harus memiliki ASP.NET AJAX 1.0atau ASP.NET 3.5menginstal pada sistem Anda. Silakan lihat stackoverflow.com/questions/7723489/…
Sisir
1056

Karena kita semua suka one-liners

... yang ini tergantung pada paket Newtonsoft NuGet, yang populer dan lebih baik daripada serializer default.

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

Dokumentasi: Melakukan Serialisasi dan Deserialisasi JSON

mschmoock
sumber
134
Serializer Newtonsoft adalah cara yang lebih cepat dan lebih dapat disesuaikan kemudian dibangun. Sangat merekomendasikan untuk menggunakannya. Terima kasih atas jawabannya @willsteel
Andrei
8
@ JosefPfleger harganya adalah untuk Skema JSON.NET, bukan JSON.NET serializer biasa, yaitu MIT
David Cumps
1
Pengujian saya menunjukkan bahwa Newtonsoft lebih lambat dari kelas JavaScriptSerializer. (.NET 4.5.2)
nemke
31
Jika Anda membaca dokumentasi MSDN untuk JavaScriptSerializer , itu jelas mengatakan menggunakan JSON.net.
dsghi
3
@JosefPfleger Newtionsoft JSON.net adalah lisensi MIT ... Anda dapat membuat modifikasi dan menjualnya kembali sesuai yang Anda inginkan. Halaman penetapan harga mereka adalah tentang dukungan teknis komersial, dan beberapa validator skema yang mereka miliki.
cb88
95

Gunakan perpustakaan Json.Net , Anda dapat mengunduhnya dari Nuget Packet Manager.

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

Deserializing to Object:

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );
Gokulan PH
sumber
57

Gunakan DataContractJsonSerializerkelas: MSDN1 , MSDN2 .

Contoh saya: DI SINI .

Itu juga dapat dengan aman mensterilisasi objek dari string JSON, tidak seperti JavaScriptSerializer. Tetapi secara pribadi saya masih lebih suka Json.NET .

Edgar
sumber
1
Masih tidak melihat contoh di halaman itu , tetapi di sini ada beberapa di MSDN dan di tempat lain -> yang terakhir menggunakan metode ekstensi untuk mencapai one-liners.
Cristian Diaconescu
Oh, saya melewatkan tautan MSDN kedua :)
Cristian Diaconescu
2
Ini tidak membuat serialisasi kelas-kelas biasa. Kesalahan melaporkan "Pertimbangkan menandainya dengan atribut DataContractAttribute, dan menandai semua anggotanya yang ingin Anda serialkan dengan atribut DataMemberAttribute. Jika jenisnya adalah koleksi, pertimbangkan menandainya dengan CollectionDataContractAttribute."
Michael Freidgeim
@MichaelFreidgeim Itu benar, Anda harus menandai properti di kelas yang ingin Anda serialkan dengan atribut. DataContractAttribute DataMemberAttribute
Edgar
1
@MichaelFreidgeim Mana yang lebih baik tergantung pada persyaratan. Atribut memungkinkan Anda mengonfigurasi bagaimana properti tersebut diserialisasi.
Edgar
24

Anda dapat mencapai ini dengan menggunakan Newtonsoft.json. Instal Newtonsoft.json dari NuGet. Lalu:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);
Waleed Naveed
sumber
22

Wooou! Benar-benar lebih baik menggunakan kerangka JSON :)

Berikut adalah contoh saya menggunakan 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
        }
    }
}

Ujian:

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

Hasil:

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

Sekarang saya akan mengimplementasikan metode konstruktor yang akan menerima string JSON dan mengisi bidang kelas.

Jean J. Michel
sumber
1
Pos yang bagus, ini adalah cara terbaru untuk melakukannya.
MatthewD
20

Serializer JSON baru tersedia di System.Text.Jsonnamespace. Ini termasuk dalam .NET Core 3.0 bersama kerangka dan dalam paket NuGet untuk proyek-proyek yang menargetkan .NET Standard atau .NET Framework atau .NET Core 2.x.

Kode contoh:

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

Dalam contoh ini, kelas yang akan diserialisasi memiliki properti dan bukan bidang; yang System.Text.Jsonserializer saat ini tidak ladang tidak cerita bersambung.

Dokumentasi:

tdykstra
sumber
9

Jika mereka tidak terlalu besar, apa kemungkinan kasus Anda mengekspornya sebagai JSON.

Ini juga membuatnya portabel di antara semua platform.

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);
}
pengguna8426627
sumber
8

Jika Anda menggunakan pengontrol web ASP.NET MVC, sesederhana:

string ladAsJson = Json(Lad);

Tidak percaya tidak ada yang menyebutkan ini.

micahhoover
sumber
1
Saya mendapatkan kesalahan tentang tidak bisa melakukan jsonresult ke string.
csga5000
Ini akan dikompilasi dengan mengetik secara implisit: var ladAsJson = Json (Lad).
ewomack
3

Saya akan memilih Serializer JSON ServiceStack:

using ServiceStack.Text

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

Ini juga merupakan serializer JSON tercepat yang tersedia untuk .NET: http://www.servicestack.net/benchmarks/

James
sumber
4
Itu tolok ukur yang sangat tua di sana. Saya baru saja menguji ketiga versi terbaru dari Newtonsoft, ServiceStack dan JavaScriptSerializer dan saat ini Newtonsoft adalah yang tercepat. Mereka semua melakukannya dengan cukup cepat.
Michael Logutov
1
ServiceStack tampaknya tidak gratis.
joelnet
@ Joelnet sekarang ini masalahnya, tetapi bebas ketika menjawab pertanyaan. Namun itu gratis untuk situs kecil, dan saya masih menggunakannya meskipun dibayar, itu adalah kerangka kerja yang luar biasa.
James
Beberapa tolok ukur di sini, meskipun tidak ada untuk serialisasi sendiri: docs.servicestack.net/real-world-performance
JohnLBevan
3

Gunakan kode di bawah ini untuk mengonversi XML ke JSON.

var json = new JavaScriptSerializer().Serialize(obj);
Hithesh
sumber
3

Gunakan alat ini untuk menghasilkan kelas C #, dan kemudian gunakan kode ini untuk membuat serial objek Anda:

 var json = new JavaScriptSerializer().Serialize(obj);
Artem Polishchuk
sumber
3

Ini semudah ini (ini berfungsi untuk objek dinamis juga (ketik objek)):

string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);
MarzSocks
sumber
tidak ada skrip default di bawah web. :(
M pada
Anda mencari ini: msdn.microsoft.com/en-us/library/…
MarzSocks
Saya agak mencoba tetapi tidak. Script saya kira saya harus menambahkannya sebagai referensi. Terima kasih banyak
M pada
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);
        }
}

Obyek

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

Penerapan

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

Keluaran

{
  "AppSettings": {
    "DebugMode": false
  }
}
dynamiclynk
sumber