在.NET世界中,当谈到对象序列化时,它通常用于在运行时检查对象的字段和属性.对此作业使用反射通常很慢,并且在处理大量对象时是不合需要的.另一种方法是使用IL发射或构建表达树,这些表现树相对于反射提供显着的性能增益.而后者是处理序列化时最现代化的库.但是,在运行时构建和发送IL需要花费时间,并且只有在将此信息缓存并重用于相同类型的对象时才会回收投资.
当使用Json.NET时,我不清楚使用上述哪种方法,如果确实使用了后者,是否使用了缓存.
例如,当我这样做时:
JsonConvert.SerializeObject(new Foo { value = 1 });
Run Code Online (Sandbox Code Playgroud)
Json.NET是否构建了Foo的成员访问信息并缓存以便以后重用它?
我正在尝试执行自定义序列化,所有快乐路径代码都可以工作,但空值路径的行为并不像我想要的那样。
我已将序列化程序设置设置为NullValueHandling.Ignore空(并且不使用我的自定义序列化)的对象图的其他部分已删除空值。看起来 Newtonsoft 序列化程序写入字符串生成器,因此我们应该能够“倒带”任何写入的 json 标记,但我不知道如何不写入任何内容。
什么都不做只返回会导致序列化程序抛出异常,因为 json 将无效。
有什么线索吗?
public class SpecialConvertor : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null || (int)value == 0)
{
if (serializer.NullValueHandling == NullValueHandling.Ignore)
{
//how to make this work?
}
else
{
writer.WriteNull();
}
return;
}
// the rest of WriteJson
}
// the rest of SpecialConvertor
}
Run Code Online (Sandbox Code Playgroud) 将代码从 newtonsoft json 迁移到 system.text.json 时
我需要所有可为空的字符串呈现为空字符串。
我编写了以下转换器,但所有空字符串值仍呈现为空。
对于空字符串值,不会调用 Write 方法。断点永远不会被击中。
public class EmptyStringConverter : JsonConverter<string>
{
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> Convert.ToString(reader.GetString(), CultureInfo.CurrentCulture);
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
{
if (writer == null)
throw new ArgumentNullException(nameof(writer));
writer.WriteStringValue(value ?? "");
}
}
Run Code Online (Sandbox Code Playgroud)
启动代码
services.AddControllers()
.AddJsonOptions(option =>
{
option.JsonSerializerOptions.Converters.Add(new EmptyStringConverter());
});
Run Code Online (Sandbox Code Playgroud)
控制台示例
class Program
{
static void Main(string[] args)
{
var jsonSerializerOptions = new JsonSerializerOptions();
jsonSerializerOptions.Converters.Add(new EmptyStringConverter());
var json = JsonSerializer.Serialize(new …Run Code Online (Sandbox Code Playgroud)