相关疑难解决方法(0)

Json.NET是否缓存类型的序列化信息?

在.NET世界中,当谈到对象序列化时,它通常用于在运行时检查对象的字段和属性.对此作业使用反射通常很慢,并且在处理大量对象时是不合需要的.另一种方法是使用IL发射或构建表达树,这些表现树相对于反射提供显着的性能增益.而后者是处理序列化时最现代化的库.但是,在运行时构建和发送IL需要花费时间,并且只有在将此信息缓存并重用于相同类型的对象时才会回收投资.

当使用Json.NET时,我不清楚使用上述哪种方法,如果确实使用了后者,是否使用了缓存.

例如,当我这样做时:

JsonConvert.SerializeObject(new Foo { value = 1 });
Run Code Online (Sandbox Code Playgroud)

Json.NET是否构建了Foo的成员访问信息并缓存以便以后重用它?

c# serialization json expression-trees json.net

24
推荐指数
1
解决办法
4832
查看次数

NullValueHandling.Ignore 与 JsonConverter::WriteJson

我正在尝试执行自定义序列化,所有快乐路径代码都可以工作,但空值路径的行为并不像我想要的那样。

我已将序列化程序设置设置为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)

c# json json.net

6
推荐指数
1
解决办法
2992
查看次数

System.Text.Json 将空字符串全局序列化为空字符串

将代码从 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)

c# .net-core system.text.json

5
推荐指数
1
解决办法
8309
查看次数