WCF Restful服务解析json中的枚举导致错误

时间:2012-06-11 09:10:28

标签: wcf wcf-rest

我有一个基于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
}

2 个答案:

答案 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; }