2010-09-01 2 views
1

У меня есть служба REST, которая берет JSON и XML в качестве входных данных и выполняет вызов SOAP для экстренной службы с десериализованным контентом. Классы, которые используются для десериализации, автоматически генерируются из wsdl службы SOAP. Я использую XmlSerializer в случае XML-запроса, и я хочу использовать JsonSerializer Newton JSON.NET для JSON.JSON.NET, XmlSerializer и свойство «Specified»

Теперь у меня возникла проблема, что классы, созданные WSDL, содержат свойство «Указано» для дополнительных значений атомарности (например, bool, int и т. Д.). Это обрабатывается XmlSerializer (который устанавливает свойство в соответствии с полученным XML), но не с помощью Newton JSON.NET Serializer. Я не хочу заставить вызывающего добавить элементы XXXSpecified в строку JSON.

Как я могу обработать «заданные» свойства с помощью сериализатора JSON.NET?

ответ

0

Мое решение:

class MyContractResolver : DefaultContractResolver 
{ 
    private JsonObjectContract objectContract = null; 

    public override JsonContract ResolveContract(Type type) 
    { 
     JsonContract contract = base.ResolveContract(type); 
     objectContract = contract as JsonObjectContract; 
     return contract; 
    } 

    public void RemoveProperty(string name) 
    { 
     if (objectContract != null) 
     { 
      objectContract.Properties.Remove(objectContract.Properties.First(
       p => p.PropertyName == name)); 
     } 
    } 

    public void AtomarOptinalType(string name, bool specified) 
    { 
     if (objectContract != null) 
     { 
      if (!specified) 
      { 
       JsonProperty prop = objectContract.Properties.First(
        p => p.PropertyName == name); 
       objectContract.Properties.Remove(prop); 
      } 

      RemoveProperty(name + "Specified"); 
     } 
    } 
} 

, а затем в продолжении сгенерированных классов:

public partial class MyGeneratedClass 
{ 
    [OnDeserializing] 
    internal void OnDeserializingMethod(StreamingContext context) 
    { 
     this.PropertyChanged += 
      new System.ComponentModel.PropertyChangedEventHandler(
       MyGeneratedClass_PropertyChanged); 
    } 

    [OnSerializing] 
    internal void OnSerializingMethod(StreamingContext context) 
    { 
     MyContractResolver cr = context.Context as MyContractResolver; 

     if (cr != null) 
     { 
      cr.AtomarOptinalType("MyAtomarOptionalProperty", 
       this.MyAtomarOptionalPropertySpecified); 
     } 
    } 

    void MyGeneratedClass_PropertyChanged(object sender, 
      System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "MyAtomarOptionalProperty") 
     { 
      this.MyAtomarOptionalPropertySpecified = true; 
     } 
    } 
} 
Смежные вопросы