2015-08-05 5 views
0

Похоже, что публикация (HTTP POST) JSON со свойством, содержащим XML-фрагмент, не будет правильно сериализоваться, если это свойство является XElement в моем классе. Вот пример:Deserialized xml дает null XElement

public class MYController : ApiController 
    { 
     public MyClass Post(MyClass postedObject) 
     { 
      return postedObject; 
     } 
    } 

public class MyClass 
{ 
    public DateTime MyDate { get; set; } 
    public XElement MyXml{ get; set; } 
} 

Отправленное Javascript объект:

{ 
    "MyDate" : "2012-12-01T12:00:00", 
    "MyXml" : "<node ln=\"node\" nm=\"1\" /><node ln=\"node\" nm=\"2\" />" 
} 

Для причине XElement всегда пустой, но DateTime в порядке.

+0

MyXml содержит атрибуты не элементы. Имя тега является «узлом», поэтому объект класса следует называть «узлом» или добавить: [XmlElement («node»)] – jdweng

+0

Какой сериализатор JSON вы используете? Я бы сомневался, что он поддерживает сериализацию в/из 'XElement'. Если вы используете JSON.NET, вы можете попробовать внедрить ['JsonConverter'] (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonConverter.htm). Альтернативно, измените свойство на 'string' и проанализируйте его после десериализации. –

ответ

1

Web Api может использовать сериализатор JSON.NET для анализа опубликованных данных JSON в .NET Class Objects; Сериализатор JSON может отображать только те типы данных JSON в C# DataTypes, что означает, что строка XML в json-данных будет отображаться с использованием типа данных строки C#.

Ref: DataType mappings between .NET and JSON

Таким образом, вы не можете преобразовать строковое значение XML в XElement во время запроса HTTP POST.

Но, вы можете добиться этого, добавив некоторую логику внутри модели класса

public class MyClass 
{ 
    public DateTime MyDate { get; set; } 

    public string MyXml 
    { 
     set 
     { 
      //XML element should contain only one root element 
      //<MyXml> element act as root element 
      string myXml = "<myXml>"+ value +"</myXml>"; 
      RootXml = XElement.Parse(myXml); 
     } 
    } 

    public XElement RootXml; 

} 

--SJ

+0

Это сработало. Сначала это не было бы, но все равно было присвоено значение null. После некоторой отладки мое значение xml было неправильным, и XElement.Parse потерпел крах, но по какой-то причине веб-api проглотил бы исключение. – guiomie

+0

@guiomie, если вы используете сторонний веб-api, попробуйте получить документацию по веб-api от их конца, чтобы понять его поведение; на основе документа, попробуйте изменить логику синтаксического анализа XML в соответствии с вашими потребностями. Если вы не найдете документацию, попробуйте перечислить все возможности получения неправильной строки XML, а затем попробуйте включить логику для обработки этого неправильного значения строки XML, прежде чем отправлять ее методу XElement.Parse() –

Смежные вопросы