C#支援將json中的多種型別反序列化為object型別

PowerCoder發表於2024-11-20

我們知道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的弱型別。

相關文章