2

嗨,我将 xml 作为字符串传递

<AbcDto xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Abc">
  <Id>2</Id>
  <Description>sample string 4</Description>
  <Name>sample string 3</Name>
  <PolicyId>c17f5b9f-c9bf-4a3a-b09b-f44ec84b0d00</PolicyId>
  <Status>Active</Status>
  <TimeZoneId>USCentral</TimeZoneId>
</AbcDto>

当我尝试为 Web Api 创建自定义模型绑定器时

   public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            var json = actionContext.Request.Content.ReadAsStringAsync().Result;
            if (!string.IsNullOrEmpty(json))
            {
                var jsonObject = (JObject) Newtonsoft.Json.JsonConvert.DeserializeObject(json);
                var jsonPropertyNames = jsonObject.Properties().Select(p => p.Name).ToList();

作为参数传递给以下方法的 json 字符串是 xml 作为字符串,我在 Newtonsoft.Json.JsonConvert.DeserializeObject(json); 面临异常;异常详细信息:解析值时遇到意外字符:<。路径 '',第 0 行,第 0 位置。

4

1 回答 1

11

您收到错误是因为JsonConvert.DeserializeObject()需要 JSON 输入,而不是 XML。如果要使用 处理 XML,JObject则需要先将 XML 转换为 JSON。该类JsonConvert有一个SerializeXmlNode()用于此目的的方法。

演示:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        <AbcDto xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/Abc"">
          <Id>2</Id>
          <Description>sample string 4</Description>
          <Name>sample string 3</Name>
          <PolicyId>c17f5b9f-c9bf-4a3a-b09b-f44ec84b0d00</PolicyId>
          <Status>Active</Status>
          <TimeZoneId>USCentral</TimeZoneId>
        </AbcDto>";

        // If the json string contains XML, convert it to JSON
        if (json.TrimStart().StartsWith("<"))
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(json);
            json = JsonConvert.SerializeXmlNode(doc, Formatting.None, true);
        }

        // Now you can load the JSON into a JObject
        var jsonObject = JObject.Parse(json);
        var jsonPropertyNames = jsonObject.Properties().Select(p => p.Name).ToList();
        foreach (string name in jsonPropertyNames)
        {
            Console.WriteLine(name);
        }
    }
}

输出:

@xmlns:i
@xmlns
Id
Description
Name
PolicyId
Status
TimeZoneId
于 2013-11-15T17:54:28.473 回答