Как вернуть JSON в веб-сервис? - PullRequest
2 голосов
/ 28 мая 2010

Мне нужен пример Hello World ...

[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>

Ответы [ 2 ]

5 голосов
/ 28 мая 2010

Вам нужно только вернуть нормальную (т.е. не-JSON) строку из вашей функции, например:

 return "Hello World"

Если вы используете .Net 3.5, ваш ответ JSON будет:

 {"d":"Hello World"}
1 голос
/ 28 мая 2010

Хорошо, если вам нужно, чтобы ваш JSON был точно в паре {Message: Hello wolrd} (или если вы планируете использовать веб-сервис для чего-то более сложного), вам, вероятно, потребуется создать сериализуемый класс для этого

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

тогда в вашем веб-сервисе

     //{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);

}

...