上下文
在我的一些ASP.NET项目类中,对JSON进行序列化/反序列化
我想使用静态JsonConvert...
方法不是最好的选择,也不使用带有硬编码类的new
问题
我会在构造函数中注入一些东西吗?为此,我是否必须定义我的自定义简单接口,还是有任何约定/内置的概念如何不对类型进行硬编码?
答案 0 :(得分:2)
如果有帮助,ASP.NET Core会在某些地方抽象JSON序列化程序本身。例如,在Razor视图(视图和页面)中,可以使用Json.Serialize()
将内容序列化到正文中。这将使用IJsonHelper
提供对序列化的抽象访问,同时使用来自序列化器的所有预配置设置(确保一致的输出)。
在2.2中,基础JsonHelper
使用JsonOutputFormatter
实际提供对串行器的访问。 IJsonHelper
和JsonOutputFormatter
都可以通过依赖项注入获得,因此您可以在需要时将它们注入任何地方。
在3.0中,团队将删除对Newtonsoft.Json的直接依赖,并自行引入适当的抽象。 IJsonHelper
仍然存在。默认情况下,Newtonsoft.Json不会出现,因此,如果您依赖它(例如,因为您静态使用它),则必须自己添加一个依赖项(也许也可以切换回ASP.NET Core来使用它)
当您想反序列化时,IJsonHelper
将无济于事,并且周围没有组件可以直接访问反序列化器。在这种情况下,您始终可以自己创建一个JsonSerializer
。您可以从DI获取串行器设置:
IOptions<MvcJsonOptions> mvcJsonOptions // get through DI
var serializer = JsonSerializer.Create(mvcJsonOptions.Options.SerializerSettings);
它使用框架中全局配置的序列化设置。
通常,仅使用JsonConvert
静态也可以。但总的来说,您会尽量避免自己对序列化和反序列化。该框架已经在数据输入或输出的各个地方为您解决了这一问题。因此,根据您的用例,可能已经存在自动在JSON之间进行转换的方法。
答案 1 :(得分:0)
这不是特定于JSON序列化的。与每个静态类一样,您不能对其应用接口(更不用说第三方类了)。例如,请参见Dependency injection with a static logger, static helper class。
因此,您需要编写自己的包装器类并将其注入:
public interface IJsonSerializer
{
string SerializeObject(object o);
T DeserializeObject<T>(string json);
}
public class NewtonsoftJsonSerializer : IJsonSerializer
{
public string SerializeObject(object o)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(o);
}
public T DeserializeObject<T>(string json)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
}
}
答案 2 :(得分:0)
就我个人而言,我对抽象服务(例如JSON序列化程序)的使用不会感到烦恼。并非所有的静态方法都是错误的,也不是必须在服务中将所有内容抽象化,除非非常期望您要交换实现或创建用于测试的模拟。否则,我建议您专注于应用程序的业务逻辑,仅在必要时才创建抽象,并为应用程序的设计和可测试性提供价值。