添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本文将介绍如何能够在 JSON 中使用注释、尾随逗号和带引号的数字,以及如何将数字编写为字符串。

允许注释和尾随逗号

默认情况下,JSON 中不允许使用注释和尾随逗号。 若要在 JSON 中允许注释,请将 JsonSerializerOptions.ReadCommentHandling 属性设置为 JsonCommentHandling.Skip 。 若要允许尾随逗号,请将 JsonSerializerOptions.AllowTrailingCommas 属性设置为 true 。 下面的示例演示如何允许这两者:

var options = new JsonSerializerOptions
    ReadCommentHandling = JsonCommentHandling.Skip,
    AllowTrailingCommas = true,
WeatherForecast weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(
    jsonString,
    options
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
    .ReadCommentHandling = JsonCommentHandling.Skip,
    .AllowTrailingCommas = True
Dim weatherForecast1 = JsonSerializer.Deserialize(Of WeatherForecast)(jsonString, options)

下面是包含注释和尾随逗号的示例 JSON:

"Date": "2019-08-01T00:00:00-07:00", "TemperatureCelsius": 25, // Fahrenheit 77 "Summary": "Hot", /* Zharko */ // Comments on /* separate lines */

允许或写入带引号的数字

某些序列化程序将数字编码为 JSON 字符串(括在引号中)。

"DegreesCelsius": "23" "DegreesCelsius": 23

若要在整个输入对象图中序列化带引号的数字或接受带引号的数字,请设置 JsonSerializerOptions.NumberHandling,如以下示例中所示:

using System.Text.Json;
using System.Text.Json.Serialization;
namespace QuotedNumbers
    public class Forecast
        public DateTime Date { get; init; }
        public int TemperatureC { get; set; }
        public string? Summary { get; set; }
    public class Program
        public static void Main()
            Forecast forecast = new()
                Date = DateTime.Now,
                TemperatureC = 40,
                Summary = "Hot"
            JsonSerializerOptions options = new()
                NumberHandling =
                    JsonNumberHandling.AllowReadingFromString |
                    JsonNumberHandling.WriteAsString,
                WriteIndented = true
            string forecastJson =
                JsonSerializer.Serialize<Forecast>(forecast, options);
            Console.WriteLine($"Output JSON:\n{forecastJson}");
            Forecast forecastDeserialized =
                JsonSerializer.Deserialize<Forecast>(forecastJson, options)!;
            Console.WriteLine($"Date: {forecastDeserialized.Date}");
            Console.WriteLine($"TemperatureC: {forecastDeserialized.TemperatureC}");
            Console.WriteLine($"Summary: {forecastDeserialized.Summary}");
// Produces output like the following example:
//Output JSON:
//  "Date": "2020-10-23T12:27:06.4017385-07:00",
//  "TemperatureC": "40",
//  "Summary": "Hot"
//Date: 10/23/2020 12:27:06 PM
//TemperatureC: 40
//Summary: Hot
Imports System.Text.Json
Imports System.Text.Json.Serialization
Namespace QuotedNumbers
    Public Class Forecast
        Public Property [Date] As Date
        Public Property TemperatureC As Integer
        Public Property Summary As String
    End Class
    Public NotInheritable Class Program
        Public Shared Sub Main()
            Dim forecast1 As New Forecast() With {
                .[Date] = Date.Now,
                .TemperatureC = 40,
                .Summary = "Hot"
            Dim options As New JsonSerializerOptions() With {
                .NumberHandling = JsonNumberHandling.AllowReadingFromString Or
                        JsonNumberHandling.WriteAsString,
                .WriteIndented = True
            Dim forecastJson As String = JsonSerializer.Serialize(forecast1, options)
            Console.WriteLine($"Output JSON:{forecastJson}")
            Dim forecastDeserialized As Forecast = JsonSerializer.Deserialize(Of Forecast)(forecastJson, options)
            Console.WriteLine($"Date: {forecastDeserialized.[Date]}")
            Console.WriteLine($"TemperatureC: {forecastDeserialized.TemperatureC}")
            Console.WriteLine($"Summary: {forecastDeserialized.Summary}")
        End Sub
    End Class
End Namespace
' Produces output like the following example:
'Output JSON:
'  "Date": "2020-10-23T12:27:06.4017385-07:00",
'  "TemperatureC": "40",
'  "Summary": "Hot"
'Date: 10/23/2020 12:27:06 PM
'TemperatureC: 40
'Summary: Hot

在通过 ASP.NET Core 间接使用 System.Text.Json 时,反序列化时允许使用带引号的数字,因为 ASP.NET Core 指定 Web 默认选项

若要允许或写入特定属性、字段或类型的带引号的数字,请使用 [JsonNumberHandling] 特性。

  • System.Text.Json 概述
  • 如何对 JSON 进行序列化和反序列化
  •