咨询区
Theyouthis:
最近我将项目升级到 .NET Core 3
之后,我发现自带的 System.Text.Json.JsonSerializer
序列化器有一个奇葩的问题,它不支持对 类字段
的序列化。。。
参考如下代码:
namespace ConsoleApp6
{class Program{static void Main(string[] args){Car car = new Car(){Model = "Fit",Year = 2008,};string json = JsonSerializer.Serialize(car); // {"Year":2008}Car carDeserialized = JsonSerializer.Deserialize<Car>(json);Console.WriteLine(carDeserialized.Model); // null!}}public class Car{public int Year { get; set; } // does serialize correctlypublic string Model; // doesn't serialize correctly}
}
只有将字段
改成属性
才可以,要多坑有多坑,现在全量修改代码那是不可能的了,请问是否有变通的方法实现呢?
回答区
pavinan:
字段被序列化的问题,在 .NET5 中已经加入了,但还是需要你在 JsonSerializerOptions
中显示开启,如下代码所示:
static void Main()
{var car = new Car { Model = "Fit", Year = 2008 };// Enable supportvar options = new JsonSerializerOptions { IncludeFields = true };// Pass "options"var json = JsonSerializer.Serialize(car, options);// Pass "options"var carDeserialized = JsonSerializer.Deserialize<Car>(json, options);Console.WriteLine(carDeserialized.Model); // Writes "Fit"
}public class Car
{public int Year { get; set; }public string Model;
}
Michaël Catanzariti:
我写了一个库对 System.Text.Json
做了一些扩展,你可以试试看,github:https://github.com/dahomey-technologies/Dahomey.Json ,这个库中我已经加入了对 field 的支持,参考代码:
using System.Text.Json;
using Dahomey.Jsonpublic class Car
{public int Year { get; set; } // does serialize correctlypublic string Model; // will serialize correctly
}static void Problem() {JsonSerializerOptions options = new JsonSerializerOptions();options.SetupExtensions(); // extension method to setup Dahomey.Json extensionsCar car = new Car(){Model = "Fit",Year = 2008,};string json = JsonSerializer.Serialize(car, options); // {"Year":2008,"Model":"Fit"}Car carDeserialized = JsonSerializer.Deserialize<Car>(json);Console.WriteLine(carDeserialized.Model); // Fit
}
点评区
我去,这确实是一个蛮大的坑,幸亏我一直在用 JSON.NET
,这也说明 System.Text.Json
目前还不是特别完善,没有达到替代 JSON.NET
的程度,大家用的时候注意避坑。