3

我有一个 REST 服务,它将 JSON 和 XML 作为输入,并对带有反序列化内容的外部服务进行 SOAP 调用。用于反序列化的类是从 SOAP 服务的 wsdl 自动生成的。我在 XML 请求的情况下使用 XmlSerializer,并且我想将 Newton JSON.NET JsonSerializer 用于 JSON。

现在我遇到了问题,WSDL 生成的类包含可选原子值(例如 bool、int 等)的“指定”属性。这由 XmlSerializer(根据接收到的 XML 设置属性)而不是由 Newton JSON.NET Serializer 处理。我不想强制调用者将 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 回答