0

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));  
    }
}

誰かが私がルート要素で結果を得るのを手伝ってくれて、私がどんな種類の間違いをしたのか教えてもらえますか?

ありがとう&よろしく、Vijay

4

2 に答える 2

0

コレクションをJSONにシリアル化するため、このような形式になります。リストをプロパティとしてラップするクラスを返すことができます。そうすれば、必要なものを取得できます。

例:このようなクラスを作成できます

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

これで、JSONを期待どおりに取得できます。

{UserList:[..]}

なぜストリームを返し、すべてのシリアル化フレームワークを自分で実行しているのかわかりません。基本的に、これはすべてフレームワークによって実行されます。あなたがしなければならないのはUserListResponse、サービスメソッドからラッパークラスを返すことだけです。

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

WCFが構造をJSONまたはXMLに返す処理を行い、それについて心配する必要はありません。

于 2012-06-20T09:28:50.857 に答える
0

上記のソリューションは完全に機能しますが、メソッドでWebInvoke属性のparamter BodyStyle=WebMessageBodyStyle.WrappedResponseを使用することもできます。

これにより、値がタイプnameにラップされます。

于 2013-01-07T11:44:55.800 に答える