3

JSONとXMLを入力として受け取り、逆シリアル化されたコンテンツを使用して外部サービスへのSOAP呼び出しを行うRESTサービスがあります。デシリアライズに使用されるクラスは、SOAPサービスのwsdlから自動生成されます。XMLリクエストの場合はXmlSerializerを使用し、JSONにはNewtonJSON.NETJsonSerializerを使用したいと思います。

ここで、WSDLで生成されたクラスに、オプションのアトマー値(bool、intなど)の「Specified」プロパティが含まれているという問題があります。これは、XmlSerializer(解放されたXMLに応じてプロパティを設定する)によって処理されますが、NewtonJSON.NETSerializerによっては処理されません。呼び出し元にXXXSpecified要素をJSON文字列に追加するように強制したくありません。

「指定された」プロパティをJSON.NETシリアライザーで処理するにはどうすればよいですか?

4

1 に答える 1

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;
        }
    }
}
于 2010-09-03T15:30:13.647 に答える