在C#中使用JavaScriptConverter进行DataContract序列化

时间:2011-09-08 08:51:48

标签: c# json datacontractserializer

在将C#对象序列化为JSON时,我找不到有关如何为给定属性调用自定义转换器的信息(反之亦然)。

JSON看起来像这样:

{"ws_status": "success", "result": 32}
or
{"ws_status": "failure", "error_code": 32123}

我有我的C#对象:

[DataContract]
class WebServiceResult
{

    [DataMember(Name = "ws_status", IsRequired = true)]
    public Boolean Success { get; private set; }

    [DataMember(Name = "error_code")]
    public Int32 ErrorCode { get; private set; }

    [DataMember(Name = "result")]
    public Int32 Result { get; private set; }
}

我缺少的是如何将JSON值“success”和“failure”转换为布尔值,告诉我WS是否成功。

我已经实现了一个JavaScriptConverter,但我不知道如何将它绑定到我的C#对象的属性。

class JsonStatusConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(Boolean) })); }
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        // Here, do we get a WebServiceResult or directly the WebServiceResult.Success 
        // object?
        Boolean success = obj==null ? false : (Boolean) obj;

        Dictionary<string, object> result = new Dictionary<string, object>();
        result["ws_status"] = success ? "success" : "error";
        return result;
    }

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (dictionary == null)
            throw new ArgumentNullException("dictionary");

        if (type == typeof(String))
        {
            String status = dictionary["ws_status"] as String;

            if (status.Equals("success")) return true;
            else return false;
        }
        return null;
    }
}

也许我误解了JavaScriptConverter的概念,它只能为整个WebServiceResult对象实现(这很遗憾,因为大多数属性都是标准的)。

PS:我知道我可以直接将状态序列化为一个字符串,并有一个辅助方法将其转换为C#对象中的布尔值,但我想了解转换器,因为我需要它们在其他一些对象中。

1 个答案:

答案 0 :(得分:1)

JsonSerializer / JavaScriptSerializer和DataContractJsonSerializer是不同的实体。 DataContractJsonSerializer甚至不支持JavaScriptConverters的概念,而JavaScriptSerializer反过来也不支持DataContract编程模型。另外,使用DataContractJsonSerializer,根本没有办法在这里做你想做的事情,因为boolean是其序列化模型中的基本原语,并且在它的世界中,原语的可扩展性点被严格限制,如果不是非存在。

我认为你最好的选择(遗憾的是)完全放弃整个模型并使用Json .NET