我正在转换我们所有的项目使用JSON。. NET而不是DataContractJsonSerializer。如何使用JSON。. NET写到XmlDictionaryWriter?
当前实现(使用DataContractJsonSerializer):
public class ErrorBodyWriter : BodyWriter
{
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
if (Format == WebContentFormat.Json)
{
// How do I use json.net below?
var serializer =
new DataContractJsonSerializer(typeof(ErrorMessage));
serializer.WriteObject(writer, Error);
}
else { // xml }
}
public ErrorBodyWriter() : base(true){}
public ErrorMessage Error { get; set; }
public WebContentFormat Format { get; set; }
}
你不能直接这么做。WCF主要是基于XML的,为了支持JSON,它定义了一个JSON到XML的映射,如果用非常特定的格式编写XML,并且底层XML编写器可以生成JSON,那么将输出正确的JSON。
默认的WCF JSON序列化器(DataContractJsonSerializer
)知道如何使用该映射将JSON写入XML编写器。JSON。净不。所以一种选择是使用JSON写入内存流。. NET,然后使用WCF JSON/XML阅读器将其读入XML,然后使用它写入XmlDictionaryWriter
。代码看起来像下面的代码片段(写在记事本上,可能需要解决一些问题):
public class ErrorBodyWriter : BodyWriter
{
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
if (Format == WebContentFormat.Json)
{
var json = JsonConvert.SerializeObject(Error);
var jsonBytes = Encoding.UTF8.GetBytes(json);
using (var reader = JsonReaderWriterFactory.CreateJsonReader(jsonBytes, XmlDictionaryReaderQuotas.Max)) {
writer.WriteNode(reader, false);
}
}
else { // xml }
}
public ErrorBodyWriter() : base(true){}
public ErrorMessage Error { get; set; }
public WebContentFormat Format { get; set; }
}