在将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#对象中的布尔值,但我想了解转换器,因为我需要它们在其他一些对象中。
答案 0 :(得分:1)
JsonSerializer / JavaScriptSerializer和DataContractJsonSerializer是不同的实体。 DataContractJsonSerializer甚至不支持JavaScriptConverters的概念,而JavaScriptSerializer反过来也不支持DataContract编程模型。另外,使用DataContractJsonSerializer,根本没有办法在这里做你想做的事情,因为boolean是其序列化模型中的基本原语,并且在它的世界中,原语的可扩展性点被严格限制,如果不是非存在。
我认为你最好的选择(遗憾的是)完全放弃整个模型并使用Json .NET