我們知道json中的欄位是弱型別的,也就是說json中的一個欄位不用事先宣告具體的型別,這就導致json中某個欄位的值有可能是字串,也有可能是數字,也有可能是布林值,其它等。。。但是C#是強型別的,定義一個C#類中欄位的時候,必須宣告它是什麼型別,所以我們可以將json中有不同型別的欄位在C#中定義為object型別,來看如下程式碼示例:
using Newtonsoft.Json; namespace Net8JsonDemo { class JsonDto { public string? Name { get; set; } public int? Age { get; set; } public object? Value { get; set; } public object[]? Values { get; set; } } internal class Program { static void Main(string[] args) { string jsonWithStringValue = "{\"Name\":\"王大錘,James Wang\",\"Value\":\"你好,Hello\",\"Values\":[\"測試,testing\",1000,true]}"; string jsonWithNumberValue = "{\"Name\":\"王大錘,James Wang\",\"Value\":2000,\"Values\":[\"測試,testing\",1000,true]}"; string jsonWithBooleanValue = "{\"Name\":\"王大錘,James Wang\",\"Value\":false,\"Values\":[\"測試,testing\",1000,true]}"; JsonDto? jsonWithStringValueDto = JsonConvert.DeserializeObject<JsonDto>(jsonWithStringValue); JsonDto? jsonWithNumberValueDto = JsonConvert.DeserializeObject<JsonDto>(jsonWithNumberValue); JsonDto? jsonWithBooleanValueDto = JsonConvert.DeserializeObject<JsonDto>(jsonWithBooleanValue); Type? jsonWithStringValueType = jsonWithStringValueDto?.Value?.GetType(); Type? jsonWithNumberValueType = jsonWithNumberValueDto?.Value?.GetType(); Type? jsonWithBooleanValueDtoType = jsonWithBooleanValueDto?.Value?.GetType(); Console.WriteLine($"jsonWithStringValueType is {jsonWithStringValueType?.ToString()}"); //輸出:jsonWithStringValueType is System.String Console.WriteLine($"jsonWithNumberValueType is {jsonWithNumberValueType?.ToString()}"); //輸出:jsonWithNumberValueType is System.Int64 Console.WriteLine($"jsonWithBooleanValueDtoType is {jsonWithBooleanValueDtoType?.ToString()}"); //輸出:jsonWithBooleanValueDtoType is System.Boolean Console.WriteLine($"jsonWithStringValueType.Values[0] is {jsonWithStringValueDto?.Values?[0]?.GetType()}"); //輸出:jsonWithStringValueType.Values[0] is System.String Console.WriteLine($"jsonWithStringValueType.Values[1] is {jsonWithStringValueDto?.Values?[1]?.GetType()}"); //輸出:jsonWithStringValueType.Values[1] is System.Int64 Console.WriteLine($"jsonWithStringValueType.Values[2] is {jsonWithStringValueDto?.Values?[2]?.GetType()}"); //輸出:jsonWithStringValueType.Values[2] is System.Boolean jsonWithStringValue = JsonConvert.SerializeObject(jsonWithStringValueDto); Console.WriteLine($"jsonWithStringValueDto after serialization is \n{jsonWithStringValue}"); /*輸出: jsonWithStringValueDto after serialization is {"Name":"王大錘,James Wang","Age":null,"Value":"你好,Hello","Values":["測試,testing",1000,true]} */ Console.WriteLine("Press any key to end..."); Console.ReadLine(); } } }
本例中我們使用的是Json.NET來序列化和反序列化json,其它框架應該類似,我們可以看到C#的object型別,可以用來裝json支援的所有欄位型別,完美相容json的弱型別。