2010-05-27 77 views
2

我需要一个Hello World例子...如何在Webservice中返回JSON?

[WebService(Namespace = "xxxxx")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService()] 
public class Something : System.Web.Services.WebService 
{ 
    public Something() { } 

    [WebMethod] 
    [ScriptMethod(ResponseFormat=ResponseFormat.Json)] 
    public string HelloWorld() 
    { 
     return "{Message:'hello world'}"; 
    } 
} 

因为它会产生一个错误

{"Message":"Invalid JSON primitive: value.","StackTrace":" at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"} 

有什么不对?

编辑:如果我需要返回{Message:'',Type:1}

EDIT2:最后一个答案是:我可以返回一个Dictionary<string, string>

回答

5

您只需要返回正常(即非JSON)字符串从你的功能,如:

return "Hello World" 

假设你使用的是.NET 3.5,你的JSON响应将是:

{"d":"Hello World"} 
1

好吧,如果你需要你的JSON是exacte LLY在{消息:你好世界国际}对 (或者,如果你打算使用你的Web服务的任何东西更复杂的),你可能会需要创建一个序列化的类为

[Serializable] 
class MessageClass 
{ 
    public string Message {get;set;} 

    //any public member will automatically be serialized as JSON 
    punlic bool WillAlsoBeJsoned {get;set;} 

    //unless explicitly told not to 
    [NonSerialized] 
    [ScriptIgnoreAttribute] 
    public string WillNotBeJsoned {get;set;} 
} 

然后在你的web服务

 //{Message :"Hello World",WillAlsoBeJsoned :false} 
    [WebMethod] 
    public string HelloWorld() 


     { 
      var returnObject = new MessageClass(); 
      returnObject.Message= "Hello World"; 
      var oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();   
      return oSerializer.Serialize(returnObject); 
} 

    // return an array of the same items 
    //[{Message :"Hello World",WillAlsoBeJsoned :false}, 
    //{Message :"something else",WillAlsoBeJsoned :false}] 
    [WebMethod] 

     public string HelloWorldList() 
     { 
      var returnObject = new List<MessageClass>(); 

      var message1= new MessageClass();  
      message1.Message= "Hello World"; 

      var message2= new MessageClass(); 
      message2.Message= "something else"; 

      returnObject.Add(message1); 
      returnObject.Add(message2); 

      var oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();   
      return oSerializer.Serialize(returnObject); 

}

+0

有没有办法在不实现类的情况下返回多个值? – BrunoLM 2010-05-27 22:55:41

+1

是的,你可以返回任何可串行化的类,例如你可以返回一个DataTable – 2010-05-27 23:03:40