2010-09-01 8 views
1

J'ai un service REST qui prend en charge JSON et XML et effectue un appel SOAP à un service externe avec le contenu désérialisé. Les classes utilisées pour la désérialisation sont générées automatiquement à partir du fichier wsdl du service SOAP. J'utilise le XmlSerializer dans le cas d'une requête XML et je veux utiliser le JsonSerializer de Newton JSON.NET pour JSON.Propriété JSON.NET, XmlSerializer et "Spécifiée"

Maintenant, j'ai le problème, que les classes générées par WSDL contiennent la propriété "Specified" pour des valeurs atomiques facultatives (telles que bool, int etc.). Ceci est géré par XmlSerializer (qui définit la propriété en conséquence au XML récupéré) mais pas par le sérialiseur Newton JSON.NET. Je ne veux pas forcer l'appelant à ajouter les éléments XXXSpecified à la chaîne JSON. Comment traiter les propriétés "spécifiées" avec le sérialiseur JSON.NET?

Comment traiter les propriétés "Spécifiées" avec le sérialiseur JSON.NET?

Répondre

0

Ma solution:

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"); 
     } 
    } 
} 

puis en extension des classes générées:

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; 
     } 
    } 
} 
Questions connexes