Bagikan melalui


Cara menulis objek .NET sebagai JSON (berseri)

Artikel ini memperlihatkan cara menggunakan System.Text.Json namespace untuk mendeserialisasi ke JavaScript Object Notation (JSON). Jika Anda memindahkan kode yang ada dari Newtonsoft.Json, lihat Cara bermigrasi ke System.Text.Json.

Petunjuk / Saran

Anda dapat menggunakan bantuan AI untuk menserialisasikan ke JSON.

Untuk menulis JSON ke string atau file, panggil metode JsonSerializer.Serialize.

Contoh serialisasi

Contoh berikut membuat JSON sebagai string:

using System.Text.Json;

namespace SerializeBasic
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            var weatherForecast = new WeatherForecast
            {
                Date = DateTime.Parse("2019-08-01"),
                TemperatureCelsius = 25,
                Summary = "Hot"
            };

            string jsonString = JsonSerializer.Serialize(weatherForecast);

            Console.WriteLine(jsonString);
        }
    }
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
Dim jsonString As String

Output JSON dikurangi (spasi kosong, indentasi, dan karakter baris baru dihapus) secara default.

Contoh berikut menggunakan kode sinkron untuk membuat file JSON:

using System.Text.Json;

namespace SerializeToFile
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            var weatherForecast = new WeatherForecast
            {
                Date = DateTime.Parse("2019-08-01"),
                TemperatureCelsius = 25,
                Summary = "Hot"
            };

            string fileName = "WeatherForecast.json"; 
            string jsonString = JsonSerializer.Serialize(weatherForecast);
            File.WriteAllText(fileName, jsonString);

            Console.WriteLine(File.ReadAllText(fileName));
        }
    }
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
jsonString = JsonSerializer.Serialize(weatherForecast1)
File.WriteAllText(fileName, jsonString)

Contoh berikut menggunakan kode asinkron untuk membuat file JSON:

using System.Text.Json;

namespace SerializeToFileAsync
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
    }

    public class Program
    {
        public static async Task Main()
        {
            var weatherForecast = new WeatherForecast
            {
                Date = DateTime.Parse("2019-08-01"),
                TemperatureCelsius = 25,
                Summary = "Hot"
            };

            string fileName = "WeatherForecast.json";
            await using FileStream createStream = File.Create(fileName);
            await JsonSerializer.SerializeAsync(createStream, weatherForecast);

            Console.WriteLine(File.ReadAllText(fileName));
        }
    }
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
Dim createStream As FileStream = File.Create(fileName)
Await JsonSerializer.SerializeAsync(createStream, weatherForecast1)

Contoh sebelumnya menggunakan inferensi jenis untuk jenis yang diserialkan. Kelebihan Serialize() membutuhkan parameter jenis generik:

using System.Text.Json;

namespace SerializeWithGenericParameter
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            var weatherForecast = new WeatherForecast
            {
                Date = DateTime.Parse("2019-08-01"),
                TemperatureCelsius = 25,
                Summary = "Hot"
            };

            string jsonString = JsonSerializer.Serialize<WeatherForecast>(weatherForecast);

            Console.WriteLine(jsonString);
        }
    }
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
jsonString = JsonSerializer.Serialize(Of WeatherForecastWithPOCOs)(weatherForecast)

Anda juga dapat menggunakan AI untuk menghasilkan kode serialisasi untuk Anda. Untuk mengetahui petunjuknya, lihat bagian Gunakan AI di artikel ini.

Perilaku serialisasi

Saat Anda menggunakan System.Text.Json secara tidak langsung di aplikasi ASP.NET Core, beberapa perilaku default akan berbeda. Untuk informasi selengkapnya, lihat Pengaturan default web untuk JsonSerializerOptions.

Jenis yang didukung meliputi:

Anda dapat menerapkan pengonversi kustom untuk menangani jenis tambahan atau menyediakan fungsionalitas yang tidak didukung oleh pengonversi internal.

Berikut adalah contoh yang menunjukkan bagaimana kelas yang berisi properti koleksi dan jenis yang ditentukan pengguna dijadikan serial:

using System.Text.Json;

namespace SerializeExtra
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
        public string? SummaryField;
        public IList<DateTimeOffset>? DatesAvailable { get; set; }
        public Dictionary<string, HighLowTemps>? TemperatureRanges { get; set; }
        public string[]? SummaryWords { get; set; }
    }

    public class HighLowTemps
    {
        public int High { get; set; }
        public int Low { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            var weatherForecast = new WeatherForecast
            {
                Date = DateTime.Parse("2019-08-01"),
                TemperatureCelsius = 25,
                Summary = "Hot",
                SummaryField = "Hot",
                DatesAvailable = [DateTime.Parse("2019-08-01"), DateTime.Parse("2019-08-02")],
                TemperatureRanges = new Dictionary<string, HighLowTemps>
                    {
                        ["Cold"] = new HighLowTemps { High = 20, Low = -10 },
                        ["Hot"] = new HighLowTemps { High = 60 , Low = 20 }
                    },
                SummaryWords = ["Cool", "Windy", "Humid"]
            };

            var options = new JsonSerializerOptions { WriteIndented = true };
            string jsonString = JsonSerializer.Serialize(weatherForecast, options);

            Console.WriteLine(jsonString);
        }
    }
}

// Output:
//{
//  "Date": "2019-08-01T00:00:00-07:00",
//  "TemperatureCelsius": 25,
//  "Summary": "Hot",
//  "DatesAvailable": [
//    "2019-08-01T00:00:00-07:00",
//    "2019-08-02T00:00:00-07:00"
//  ],
//  "TemperatureRanges": {
//    "Cold": {
//      "High": 20,
//      "Low": -10
//    },
//    "Hot": {
//    "High": 60,
//      "Low": 20
//    }
//  },
//  "SummaryWords": [
//    "Cool",
//    "Windy",
//    "Humid"
//  ]
//}
Public Class WeatherForecastWithPOCOs
    Public Property [Date] As DateTimeOffset
    Public Property TemperatureCelsius As Integer
    Public Property Summary As String
    Public SummaryField As String
    Public Property DatesAvailable As IList(Of DateTimeOffset)
    Public Property TemperatureRanges As Dictionary(Of String, HighLowTemps)
    Public Property SummaryWords As String()
End Class

Public Class HighLowTemps
    Public Property High As Integer
    Public Property Low As Integer
End Class

' serialization output formatted (pretty-printed with whitespace and indentation):
' {
'   "Date": "2019-08-01T00:00:00-07:00",
'   "TemperatureCelsius": 25,
'   "Summary": "Hot",
'   "DatesAvailable": [
'     "2019-08-01T00:00:00-07:00",
'     "2019-08-02T00:00:00-07:00"
'   ],
'   "TemperatureRanges": {
'     "Cold": {
'       "High": 20,
'       "Low": -10
'     },
'     "Hot": {
'       "High": 60,
'       "Low": 20
'     }
'   },
'   "SummaryWords": [
'     "Cool",
'     "Windy",
'     "Humid"
'   ]
' }

Serialisasi ke UTF-8

Proses serialisasi ke array byte UTF-8 5-10% lebih cepat dibandingkan dengan metode berbasis string. Itu karena byte (sebagai UTF-8) tidak perlu dikonversi ke string (UTF-16).

Untuk membuat serial ke array byte UTF-8, panggil metode JsonSerializer.SerializeToUtf8Bytes:

byte[] jsonUtf8Bytes = JsonSerializer.SerializeToUtf8Bytes(weatherForecast);
Dim jsonUtf8Bytes As Byte()
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
    .WriteIndented = True
}
jsonUtf8Bytes = JsonSerializer.SerializeToUtf8Bytes(weatherForecast1, options)

Satu pengulangan fungsi dengan Serialize yang menerima Utf8JsonWriter juga tersedia.

Serialisasi ke JSON terformat

Untuk mencetak output JSON dengan cantik, atur JsonSerializerOptions.WriteIndented ke true:

using System.Text.Json;

namespace SerializeWriteIndented
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            var weatherForecast = new WeatherForecast
            {
                Date = DateTime.Parse("2019-08-01"),
                TemperatureCelsius = 25,
                Summary = "Hot"
            };

            var options = new JsonSerializerOptions { WriteIndented = true };
            string jsonString = JsonSerializer.Serialize(weatherForecast, options);

            Console.WriteLine(jsonString);
        }
    }
}
// output:
//{
//  "Date": "2019-08-01T00:00:00-07:00",
//  "TemperatureCelsius": 25,
//  "Summary": "Hot"
//}
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
    .WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast, options)

Mulai dari .NET 9, Anda juga dapat menyesuaikan karakter dan ukuran inden menggunakan IndentCharacter dan IndentSize.

Petunjuk / Saran

Jika Anda menggunakan JsonSerializerOptions berulang kali dengan opsi yang sama, jangan buat instans JsonSerializerOptions baru setiap kali menggunakannya. Gunakan kembali "instance" yang sama untuk setiap panggilan. Untuk informasi selengkapnya, lihat Menggunakan kembali instans JsonSerializerOptions.

Menggunakan AI untuk menserialisasikan ke JSON

Anda dapat menggunakan alat AI, seperti GitHub Copilot, untuk menghasilkan kode yang menggunakan System.Text.Json untuk mensereal ke JSON. Anda dapat menyesuaikan perintah agar sesuai dengan bidang objek dan kebutuhan serialisasi Anda.

Berikut adalah contoh perintah yang dapat Anda gunakan untuk menghasilkan kode serialisasi:

I have a variable named weatherForecast of type WeatherForecast.
Serialize the variable using System.Text.Json and write the result directly to a file named "output.json" with the JSON indented for pretty formatting.
Ensure the code includes all necessary using directives and compiles without errors.

Tinjau saran Copilot sebelum menerapkannya.

Untuk informasi selengkapnya tentang GitHub Copilot, lihat FAQ GitHub.

Lihat juga