我正在将所有项目转换为使用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; }
}
答案 0 :(得分:1)
你不能直接这样做。 WCF主要是基于XML的,为了支持JSON,它被定义为JSON-to-XML mapping,如果以非常特定的格式编写XML,并且底层XML编写器可以生成JSON,那么将输出正确的JSON。 p>
默认的WCF JSON序列化程序(DataContractJsonSerializer
)知道如何使用该映射将JSON写入XML编写器。 JSON.NET没有。因此,一种选择是使用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; }
}