Membuat serial daftar ke JSON

182

Saya memiliki model objek yang terlihat seperti ini:

public MyObjectInJson
{
   public long ObjectID {get;set;}
   public string ObjectInJson {get;set;}
}

Properti ObjectInJsonini merupakan versi berseri yang merupakan objek yang berisi daftar bersarang. Untuk saat ini, saya membuat serial daftar MyObjectInJsonsecara manual seperti ini:

StringBuilder TheListBuilder = new StringBuilder();

TheListBuilder.Append("[");
int TheCounter = 0;

foreach (MyObjectInJson TheObject in TheList)
{
  TheCounter++;
  TheListBuilder.Append(TheObject.ObjectInJson);

  if (TheCounter != TheList.Count())
  {
    TheListBuilder.Append(",");
  }
}
TheListBuilder.Append("]");

return TheListBuilder.ToString();

Saya ingin tahu apakah saya dapat mengganti kode berbahaya semacam ini dengan JavascriptSerializerdan mendapatkan hasil yang sama. Bagaimana saya melakukan ini?

Terima kasih.

perancis
sumber
Perhatikan bahwa dalam proyek WPF, Anda perlu menambahkan referensi System.Web.Extensionsuntuk menggunakan System.Web.Script.Serialization: stackoverflow.com/a/18746092/1599699 stackoverflow.com/a/19299695/1599699
Andrew

Jawaban:

338

Jika menggunakan .Net Core 3.0 atau yang lebih baru;

Default untuk menggunakan System.Text.Jsonimplementasi parser bawaan.

misalnya

using System.Text.Json;

var json = JsonSerializer.Serialize(aList);

Sebagai alternatif, lainnya, opsi yang kurang umum tersedia seperti Utf8Json parser dan Jil : Ini mungkin menawarkan kinerja yang unggul , jika Anda benar-benar membutuhkannya, Anda harus menginstal paket masing-masing.

Jika macet menggunakan .Net Core 2.2 atau sebelumnya;

Default menggunakan Newtonsoft JSON.Net sebagai Parser JSON pilihan pertama Anda.

misalnya

using Newtonsoft.Json;

var json = JsonConvert.SerializeObject(aList);

Anda mungkin perlu menginstal paket terlebih dahulu.

PM> Install-Package Newtonsoft.Json

Untuk perincian lebih lanjut, lihat dan pilih jawaban yang menjadi sumber informasi ini .

Sebagai referensi saja, ini adalah jawaban asli, bertahun-tahun yang lalu;

// you need to reference System.Web.Extensions

using System.Web.Script.Serialization;

var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(aList);
Jodrell
sumber
1
ah ok, itu juga serialisasi daftar objek dan bukan hanya objek itu sendiri. Terima kasih.
frenchie
tidak suka hubungan siklis tapi itu bukan masalah di sini
Jodrell
13
Perhatikan bahwa namespace ini secara tersembunyi tersimpan dalam System.Web.Extensions. Setelah Anda menambahkannya sebagai referensi, solusinya akan bekerja dengan brilian!
Eight-Bit Guru
1
Saya melihat jawaban Anda yang telah diedit dan sangat berharap saya memiliki contoh yang diperbarui.
Dylan Brams
1
@ IamNumber5 sudah disediakan di jawaban yang lain. Saya toh memperpanjang jawaban saya.
Jodrell
111

Anda juga dapat menggunakan Json.NET. Cukup unduh di http://james.newtonking.com/pages/json-net.aspx , ekstrak file yang dikompresi dan tambahkan sebagai referensi.

Kemudian, sambungkan daftar (atau objek apa pun yang Anda inginkan) dengan yang berikut:

using Newtonsoft.Json;

string json = JsonConvert.SerializeObject(listTop10);

Pembaruan: Anda juga dapat menambahkannya ke proyek Anda melalui Manajer Paket NuGet (Alat -> Manajer Paket NuGet -> Konsol Manajer Paket):

PM> Install-Package Newtonsoft.Json

Dokumentasi: Serializing Collections

Brent Barbata
sumber
12

Ada dua cara umum untuk melakukan itu dengan serializers JSON bawaan:

  1. JavaScriptSerializer

    var serializer = new JavaScriptSerializer();
    return serializer.Serialize(TheList);
    
  2. DataContractJsonSerializer

    var serializer = new DataContractJsonSerializer(TheList.GetType());
    using (var stream = new MemoryStream())
    {
        serializer.WriteObject(stream, TheList);
        using (var sr = new StreamReader(stream))
        {
            return sr.ReadToEnd();
        }
    }
    

    Perhatikan, bahwa opsi ini memerlukan definisi kontrak data untuk kelas Anda:

    [DataContract]
    public class MyObjectInJson
    {
       [DataMember]
       public long ObjectID {get;set;}
       [DataMember]
       public string ObjectInJson {get;set;}
    }
    
Joulukuusi
sumber
5
public static string JSONSerialize<T>(T obj)
        {
            string retVal = String.Empty;
            using (MemoryStream ms = new MemoryStream())
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                serializer.WriteObject(ms, obj);
                var byteArray = ms.ToArray();
                retVal = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
            }
            return retVal;
        }
samsanthosh2008
sumber
4

.NET sudah mendukung serialisasi Json dasar melalui System.Runtime.Serialization.Json namespace dan kelas DataContractJsonSerializer sejak versi 3.5. Seperti namanya, DataContractJsonSerializer memperhitungkan setiap anotasi data yang Anda tambahkan ke objek Anda untuk membuat hasil akhir Json.

Itu bisa berguna jika Anda sudah memiliki kelas data beranotasi yang ingin Anda serialkan Json ke aliran, seperti yang dijelaskan dalam Cara: Serialize dan Deserialize Data JSON . Ada batasan tetapi cukup baik dan cukup cepat jika Anda memiliki kebutuhan dasar dan tidak ingin menambahkan Pustaka Lain ke proyek Anda.

Kode berikut serializea daftar ke aliran output konsol. Seperti yang Anda lihat itu sedikit lebih verbose daripada Json.NET dan bukan tipe-aman (yaitu tidak ada obat generik)

        var list = new List<string> {"a", "b", "c", "d"};

        using(var output = Console.OpenStandardOutput())                
        {                
            var writer = new DataContractJsonSerializer(typeof (List<string>));
            writer.WriteObject(output,list);
        }

Di sisi lain, Json.NET menyediakan kontrol yang jauh lebih baik atas cara Anda menghasilkan Json. Ini akan sangat berguna ketika Anda harus memetakan nama-nama yang ramah javascript ke kelas .NET, memformat tanggal ke json dll.

Opsi lain adalah ServiceStack.Text , bagian dari tumpukan ServicStack ..., yang menyediakan serangkaian serialisator yang sangat cepat untuk Json, JSV dan CSV.

Panagiotis Kanavos
sumber
0

membangun jawaban dari postingan lain .. Saya telah menemukan cara yang lebih umum untuk membuat daftar, menggunakan pencarian dinamis dengan Json.NET versi 12.x

using Newtonsoft.Json;

static class JsonObj
{
    /// <summary>
    /// Deserializes a json file into an object list
    /// Author: Joseph Poirier 2/26/2019
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fileName"></param>
    /// <returns></returns>
    public static List<T> DeSerializeObject<T>(string fileName)
    {
        List<T> objectOut = new List<T>();

        if (string.IsNullOrEmpty(fileName)) { return objectOut; }

        try
        {
            // reading in full file as text
            string ss = File.ReadAllText(fileName);

            // went with <dynamic> over <T> or <List<T>> to avoid error..
            //  unexpected character at line 1 column 2
            var output = JsonConvert.DeserializeObject<dynamic>(ss);

            foreach (var Record in output)
            {
                foreach (T data in Record)
                {
                    objectOut.Add(data);
                }
            }
        }
        catch (Exception ex)
        {
            //Log exception here
            Console.Write(ex.Message);
        }

        return objectOut;
    }
}

ajakan untuk memproses

{
        string fname = "../../Names.json"; // <- your json file path

        // for alternate types replace string with custom class below
        List<string> jsonFile = JsonObj.DeSerializeObject<string>(fname);
}

atau panggilan untuk memproses ini

{
        string fname = "../../Names.json"; // <- your json file path

        // for alternate types replace string with custom class below
        List<string> jsonFile = new List<string>();
        jsonFile.AddRange(JsonObj.DeSerializeObject<string>(fname));
}
Joseph Poirier
sumber