C#支持将json中的多种类型反序列化为object类型
我们知道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]}"; string jsonWithNullValue = "{\"Name\":\"王大锤,James Wang\",\"Value\":null,\"Values\":[\"测试,testing\",1000,true]}"; JsonDto? jsonWithStringValueDto = JsonConvert.DeserializeObject<JsonDto>(jsonWithStringValue); JsonDto? jsonWithNumberValueDto = JsonConvert.DeserializeObject<JsonDto>(jsonWithNumberValue); JsonDto? jsonWithBooleanValueDto = JsonConvert.DeserializeObject<JsonDto>(jsonWithBooleanValue); JsonDto? jsonWithNullValueDto = JsonConvert.DeserializeObject<JsonDto>(jsonWithNullValue); Type? jsonWithStringValueDtoType = jsonWithStringValueDto?.Value?.GetType(); Type? jsonWithNumberValueDtoType = jsonWithNumberValueDto?.Value?.GetType(); Type? jsonWithBooleanValueDtoType = jsonWithBooleanValueDto?.Value?.GetType(); Type? jsonWithNullValueDtoType = jsonWithNullValueDto?.Value?.GetType(); Console.WriteLine($"jsonWithStringValueDtoType is {jsonWithStringValueDtoType?.ToString()}"); //输出:jsonWithStringValueDtoType is System.String Console.WriteLine($"jsonWithNumberValueDtoType is {jsonWithNumberValueDtoType?.ToString()}"); //输出:jsonWithNumberValueDtoType is System.Int64 Console.WriteLine($"jsonWithBooleanValueDtoType is {jsonWithBooleanValueDtoType?.ToString()}"); //输出:jsonWithBooleanValueDtoType is System.Boolean Console.WriteLine($"jsonWithNullValueDtoType is {jsonWithNullValueDtoType?.ToString()}"); //输出:jsonWithNullValueDtoType is Console.WriteLine($"jsonWithStringValueDto.Values[0] is {jsonWithStringValueDto?.Values?[0]?.GetType()?.ToString()}"); //输出:jsonWithStringValueDto.Values[0] is System.String Console.WriteLine($"jsonWithStringValueDto.Values[1] is {jsonWithStringValueDto?.Values?[1]?.GetType()?.ToString()}"); //输出:jsonWithStringValueDto.Values[1] is System.Int64 Console.WriteLine($"jsonWithStringValueDto.Values[2] is {jsonWithStringValueDto?.Values?[2]?.GetType()?.ToString()}"); //输出:jsonWithStringValueDto.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]} */ jsonWithNullValue = JsonConvert.SerializeObject(jsonWithNullValueDto); Console.WriteLine($"jsonWithNullValueDto after serialization is \n{jsonWithNullValue}"); /*输出: jsonWithNullValueDto after serialization is {"Name":"王大锤,James Wang","Age":null,"Value":null,"Values":["测试,testing",1000,true]} */ Console.WriteLine("Press any key to end..."); Console.ReadLine(); } } }
本例中我们使用的是Json.NET来序列化和反序列化json,其它框架应该类似,我们可以看到C#的object类型,可以用来装json支持的所有字段类型,完美兼容json的弱类型。