【问题标题】:Deserialize Json from a stream using a custom converter使用自定义转换器从流中反序列化 Json
【发布时间】:2024-01-11 21:52:01
【问题描述】:

我正在反序列化一个大型 JSON 片段,我将其作为从请求到 REST 端点的响应正文。

我使用下面的代码

var serializer = new JsonSerializer();
var sr = new StreamReader(responseStream))
var jsonTextReader = new JsonTextReader(sr))
{
    return serializer.Deserialize<ResultItem>(jsonTextReader);
}

我需要在构造每个 ResultItem 时为其注入一些“元数据”。为此,我编写了一个自定义转换器,如下所示

 public class ResultItemConverter : CustomCreationConverter<ResultItem>
{
    private Metadata typeMetadata;

    public ResultItemConverter(Metadata typeMetadata)
    {
        this.typeMetadata = typeMetadata;
    }

    public override ResultItem Create(Type objectType)
    {
        return new ResultItem(this.typeMetadata);
    }
}

不幸的是,我没有办法将此转换器传递给反序列化方法!找到的所有示例都使用允许指定转换器的“JsonConvert.DeserializeObject”方法。

我的问题 -

  • 如果我需要将一些额外信息传递给正在反序列化的对象的 ctor,我的自定义转换器方法是否正确?
  • 如何使反序列化与流一起使用我的自定义转换器?我无法将流序列化为字符串;这会导致 OutOfMemoryException

【问题讨论】:

    标签: c# json.net deserialization json-deserialization


    【解决方案1】:

    您需要自定义序列化程序本身。例如:

    serializer.Converters.Add(new ResultItemConverter());
    

    我不知道在这种情况下您是否必须使用自定义转换器,但您可以这样轻松地做到这一点。

    【讨论】:

    • jeez...完全忽略了“Converters”属性是一个集合的事实!看到了吸气剂,没有再看了!