为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?相关的知识,希望对你有一定的参考价值。
咨询区
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 correctly
public string Model; // doesn't serialize correctly
}
}
只有将字段
改成属性
才可以,要多坑有多坑,现在全量修改代码那是不可能的了,请问是否有变通的方法实现呢?
回答区
pavinan:
字段被序列化的问题,在 .NET5 中已经加入了,但还是需要你在 JsonSerializerOptions
中显示开启,如下代码所示:
static void Main()
{
var car = new Car { Model = "Fit", Year = 2008 };
// Enable support
var 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.Json
public class Car
{
public int Year { get; set; } // does serialize correctly
public string Model; // will serialize correctly
}
static void Problem() {
JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions(); // extension method to setup Dahomey.Json extensions
Car 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
的程度,大家用的时候注意避坑。
以上是关于为啥 .NET 自带的 JsonSerializer 无法序列化 Field ?的主要内容,如果未能解决你的问题,请参考以下文章
JsonSerialize的字段[include]已经过时,已被JsonInclude代替