我是一个有用的助手,能够翻译文本。
我正在开发一个ASP .Net Core 3.1应用程序,将另一个使用2.2的代码部分移植过来。到目前为止,我想从NewtonSoft JSON序列化库切换到新的System.Text.Json,但我遇到了一些问题。
考虑一个函数,用于提供带有此返回类型的HTTP-GET服务:
然后,最后一部分可以描述如下:
然而,它并没有起作用:项目集合按其声明类型(IMyInterface)进行序列化,而不是实际类型。我在这里读到,这是一种预期的行为,尽管对我来说不是很直观。
我的问题是:是否有任何方便而可靠的方法来利用新的序列化程序,即使处理匿名对象? 我希望避免每次都创建一个特定对象,而是可以内联组成结果。
更新:
这样做似乎可以解决问题,但看起来真的很丑:
我正在开发一个ASP .Net Core 3.1应用程序,将另一个使用2.2的代码部分移植过来。到目前为止,我想从NewtonSoft JSON序列化库切换到新的System.Text.Json,但我遇到了一些问题。
考虑一个函数,用于提供带有此返回类型的HTTP-GET服务:
[HttpGet("myservice")]
public async Task<ActionResult<object>> GetDataAsync( ...
然后,最后一部分可以描述如下:
var items = new List<IMyInterface>();
int totalCount = ...
int min = ...
int max = ...
return new ActionResult<object>(new
{
totalCount,
min,
max,
items
});
然而,它并没有起作用:项目集合按其声明类型(IMyInterface)进行序列化,而不是实际类型。我在这里读到,这是一种预期的行为,尽管对我来说不是很直观。
我的问题是:是否有任何方便而可靠的方法来利用新的序列化程序,即使处理匿名对象? 我希望避免每次都创建一个特定对象,而是可以内联组成结果。
更新:
这样做似乎可以解决问题,但看起来真的很丑:
return new ActionResult<object>(new
{
totalCount,
min,
max,
items = items.Cast<object>()
});
items = items.Cast<object>(),
确实有效:https://dotnetfiddle.net/KxWHTu。这有点令人惊讶。我理解为什么他们不想支持多态反序列化,因为它会使服务器容易受到[Friday the 13th JSON attacks](https://dev59.com/glUM5IYBdhLWcg3wSexQ)的攻击。但是,除非声明类型是“object”,否则序列化声明类型而不是实际类型似乎很奇怪。至少数据合同序列化程序会在出现意外类型时抛出异常,而不仅仅将其序列化为基本类型。 - dbc