使用JSON.NET序列化为XmlDictionaryWriter

时间:2014-08-20 17:43:10

标签: c# json wcf json.net

我正在将所有项目转换为使用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; }
}

1 个答案:

答案 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; }
}