使用WCF Rest不以JSON格式获取根名称

时间:2012-06-20 07:47:50

标签: json wcf rest

我没有获得Json格式的任何根值。 我得到的答复如下:

[{"Username":"demo","UserID":8,"Password":"demo","EmaiID":"demo@gmail.com"}]

我想格式如下

{UserList: [[{"Username":"demo","UserID":8,"Password":"demo","EmaiID":"demo@gmail.com"}]}

服务声明:

public interface IDemo
{  
    [OperationContract]
    [WebInvoke(RequestFormat = WebMessageFormat.Json,ResponseFormat =
    WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = "/Validate", Method = "POST")]
    Stream ValidateUser(Login obj);

}

[DataContract]
public class Login
{

    public Login()
    {
    }

    [DataMember]
    public string Username { get; set; }
    [DataMember]
    public string Password { get; set; }
}

服务定义:

public class Demo: IDemo
{
    string Json = string.Empty;

    JavaScriptSerializer obj1 = new JavaScriptSerializer();

    public Stream ValidateUser(Login obj)
    {

        UserList objUserList = new UserList();
        Users objUser = new Users();
        objUser.Username = obj.Username;
        objUser.Password = obj.Password;

        objUserList = LoginDataService.ValidateUser(objUser.Username,objUser.Password) ;

        if (objUserList.Count > 0)
        {
            Json = obj1.Serialize(objUserList);
            WebOperationContext.Current.OutgoingResponse.ContentType =  
            "application/json; charset=utf-8"; 
        }
        else
        {
            UserError objError = new UserError();

            objError.ErrMsg = "LoginFailed";objError.Username = objUser.Username ;

            Json = obj1.Serialize(objError);

            WebOperationContext.Current.OutgoingResponse.ContentType = 
            "application/json; charset=utf-8";
        }

        return new MemoryStream(Encoding.UTF8.GetBytes(Json));  
    }
}

任何人都可以帮我用root元素获取结果,让我知道我做了什么样的错误。

谢谢&问候, 维杰

2 个答案:

答案 0 :(得分:0)

您正在获取类似的格式,因为您将集合序列化为JSON。你可以返回一个将列表作为属性包装在内的类,然后你就会得到你想要的东西。

对于前。你可以创建一个这样的类

public class UserListResponse
{
   public UserList UserList{get; set;}
} 

现在你可以像你期望的那样得到JSON,比如

{UserList:[..]}

我不明白为什么要返回Stream并自己完成所有序列化框架,基本上这一切都是由框架完成的。您所要做的就是从服务方法返回包装类UserListResponse

public class Demo: IDemo
{
   public UserListResponse ValidateUser(Login obj)
   {
      ...
      return new UserListResponse{ UserList = objUserList};
   }
}

WCF将负责将结构返回到JSON或XML中,您不必担心这一点。

答案 1 :(得分:0)

虽然上述解决方案完美无缺,但您也可以尝试在方法上使用参数BodyStyle = WebMessageBodyStyle.WrappedResponse of WebInvoke属性。

这包含了类型名称中的值。