使用自定义转换器从流中反序列化 Json
Deserialize Json from a stream using a custom converter
我正在反序列化一个大的 JSON 片段,该片段作为从请求到 REST 端点的响应正文获得。
我使用下面的代码
var serializer = new JsonSerializer();
var sr = new StreamReader(responseStream))
var jsonTextReader = new JsonTextReader(sr))
{
return serializer.Deserialize<ResultItem>(jsonTextReader);
}
我需要在构建每个 ResultItem 时注入一些 'metadata'。为此,我编写了一个自定义转换器,如下所示
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);
}
}
不幸的是,我没有办法将此转换器传递给 Deserialize 方法!找到的所有示例都使用允许指定转换器的 'JsonConvert.DeserializeObject' 方法。
我的问题 -
- 如果我需要将一些额外的信息传递给被反序列化的对象的构造函数,我的自定义转换器方法是否正确?
- 如何使用我的自定义转换器和流进行反序列化?我无法将流序列化为字符串;导致 OutOfMemoryException.
您需要自定义序列化器本身。例如:
serializer.Converters.Add(new ResultItemConverter());
我不知道你是否有在这种情况下使用自定义转换器,但这就是你可以轻松做到的方法。
我正在反序列化一个大的 JSON 片段,该片段作为从请求到 REST 端点的响应正文获得。
我使用下面的代码
var serializer = new JsonSerializer();
var sr = new StreamReader(responseStream))
var jsonTextReader = new JsonTextReader(sr))
{
return serializer.Deserialize<ResultItem>(jsonTextReader);
}
我需要在构建每个 ResultItem 时注入一些 'metadata'。为此,我编写了一个自定义转换器,如下所示
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);
}
}
不幸的是,我没有办法将此转换器传递给 Deserialize 方法!找到的所有示例都使用允许指定转换器的 'JsonConvert.DeserializeObject' 方法。
我的问题 -
- 如果我需要将一些额外的信息传递给被反序列化的对象的构造函数,我的自定义转换器方法是否正确?
- 如何使用我的自定义转换器和流进行反序列化?我无法将流序列化为字符串;导致 OutOfMemoryException.
您需要自定义序列化器本身。例如:
serializer.Converters.Add(new ResultItemConverter());
我不知道你是否有在这种情况下使用自定义转换器,但这就是你可以轻松做到的方法。