将Json发布到WebApi - 反序列化为XmlNode

时间:2015-10-19 20:25:17

标签: angularjs asp.net-web-api asp.net-web-api2

我正在使用angular $http.post()发送一个JSON对象。

填充Id值等。但是,XmlNode属性不是反序列化,并且为null。这个相同的配置实体被序列化为json而没有问题。

如何正确反序列化XmlNode?

注意:我无法更改配置类。另外,我正在使用CamelCasePropertyNamesContractResolver Json Formatter。

网络Api控制器

[Route("api/config/{Id}")]
[HttpPut]
public IHttpActionResult Save(Guid Id, Configuration config)
{
    ... config.Configuration is null ...
    return Ok();
}

配置类

public class Configuration {
  public string Id { get; private set; }
  public XmlNode Configuration { get; private set; }
}

Json数据:

{
    "Id": "1",
    "configuration": {
        "Config": {
            "Settings": {
                "Setting": [
                    {
                        "@SettingId": "1",
                        "@Name": "DEFAULT"
                    }
                ]
            }
        }
    }
}

编辑:我已经验证了在使用XmlDocument而不是XmlNode时XML正确序列化。

1 个答案:

答案 0 :(得分:0)

我写了一个自定义JsonConverter,将XmlNode转换为XmlDocument

public class XmlNodeConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(XmlNode);
    }

    public override bool CanRead
    {
        get
        {
            return true;
        }
    }

    public override bool CanWrite
    {
        get
        {
            return false;
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jsonObject = JObject.Load(reader);
        XmlDocument document = JsonConvert.DeserializeXmlNode(jsonObject.ToString());

        return document;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

将转换器添加到JsonFormatter.SerializerSettings

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new XmlNodeConverter());

这很有效,但看起来像是黑客。还有更好的方法吗?