我有一个基于WCF的宁静服务,如下所示:
(FeedbackInfo类只有一个enum
成员 - ServiceCode。)
[OperationContract]
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public List<FeedbackInfo> GetFeedbackInfoList(ServiceCode code)
{
return ALLDAO.GetFeedbackInfoList(code);
}
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public int? CreateFeedback(FeedbackInfo feedback)
{
return ALLDAO.CreateFeedback(feedback);
}
我将使用jquery ajax来调用这两个方法,如下所示:
$.ajax({
type: "GET",
url: "/Service/ALL.svc/GetFeedbackInfoList",
datatype: "text/json",
data: { "code": "Info"},
});
var feedbackInfo = { feedback: {
ServiceCode: "Info"
}};
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "/Service/ALL.svc/CreateFeedback",
datatype: "text/json",
data: JSON.stringify(feedbackInfo),
});
第一次呼叫将成功完成,而第二次呼叫会给我一个错误:值&#34;信息&#34;无法解析为类型&#39; Int64&#39;。我想知道为什么在第二次调用中无法解析同一个枚举?仅仅因为枚举类型被用作类的成员?
修改 FeedbackInfo和ServiceCode如下所示:
public class FeedbackInfo
{
public int ID { get; set; }
public string Title { get; set; }
public ServiceCode ServiceCode { get; set; }
}
[DataContract]
public enum ServiceCode
{
[EnumMember]
Info,
[EnumMember]
Error
}
答案 0 :(得分:1)
我已经整理了一个使用Newtonsoft.Json
库的更好的解决方案。它修复了枚举问题,也使错误处理更好。它有很多代码,所以你可以在GitHub上找到它:https://github.com/jongrant/wcfjsonserializer/blob/master/NewtonsoftJsonFormatter.cs
您必须向Web.config
添加一些条目才能使其正常工作,您可以在此处查看示例文件:
https://github.com/jongrant/wcfjsonserializer/blob/master/Web.config
答案 1 :(得分:0)
枚举被序列化为整数,因此您需要使用ServiceCode:1(或其他),或者在 FeedbackInfo 类中添加自定义属性以从给定字符串反序列化枚举值。即,像这样:
public string ServiceCode {
get {
return ServiceCodeEnum.ToString();
}
set {
MyEnum enumVal;
if (Enum.TryParse<MyEnum>(value, out enumVal))
ServiceCodeEnum = enumVal;
else
ServiceCodeEnum = default(MyEnum);
}
}
private MyEnum ServiceCodeEnum { get; set; }