RESTful ASP.NET webservice - 如何返回JSON序列化的Dictionary <string,object>?</string,object>

时间:2011-09-29 16:41:24

标签: asp.net json rest serialization

我有一个RESTful Web服务,它返回JSON序列化数据。它可以成功序列化Dictionary<string, string>对象,但我希望每个函数都能够返回Dictionary<string, object>

当我返回Dictionary<string, string>时,我得到了预期的JSON响应。但是当我尝试返回Dictionary<string, object>时,我得到了这个回复:

  

ReadResponse()失败:服务器没有为此返回响应   请求。

所以,关于代码! 以下是失败的Dictionary<string, object>代码

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public Dictionary<string, object> Test(String Token, String Id)
{
    Dictionary<string, object> testresults = new Dictionary<string, object>();
    testresults.Add("Test1Key", "Test1Value");

    Dictionary<string, string> innertestresults = new Dictionary<string, string>();
    innertestresults.Add("InnerTest1Key", "InnerTest1Value");
    innertestresults.Add("InnerTest2Key", "InnerTest2Value");

    testresults.Add("Test2Key", innertestresults);

    return testresults;
}

而且,只是为了踢/参考,这里是完美运行的Dictionary<string,string>代码

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public Dictionary<string, string> Test(String Token, String Id)
{
    Dictionary<string, string> testresults = new Dictionary<string, string>();
    testresults.Add("Test1Key", "Test1Value");
    testresults.Add("Test2Key", "Test2Value");
    testresults.Add("Test3Key", "Test3Value");

    return testresults;
}

如果有人有任何关于如何使其发挥作用的想法(或任何其他方法来达到相同的最终结果),请告诉我!我对如何做到这一点非常开放。

关于使用的主题 ...我需要混音的原因是我可以返回这样的结果(“数据”部分可能是任何东西......不一定是密钥ID,类型和MaxUsers):

{"Status":"Success","Data":{"ID":"1234","Type":"Live","MaxUsers":"5"}}
{"Status":"Failure","Error":"ID does not exist"}

非常感谢你们!

2 个答案:

答案 0 :(得分:3)

我可以重新创建您遇到的错误,但是没有幸运获得服务来自动序列化Dictionary<string, object>对象。

一种解决方法是使用JavaScriptSerializer类在代码中序列化对象,并返回结果字符串,如下所示:

using System.Web.Script.Serialization;

...

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string Test(String Token, String Id)
{
    Dictionary<string, object> testresults = new Dictionary<string, object>();
    testresults.Add("Test1Key", "Test1Value");

    Dictionary<string, string> innertestresults = new Dictionary<string, string>();
    innertestresults.Add("InnerTest1Key", "InnerTest1Value");
    innertestresults.Add("InnerTest2Key", "InnerTest2Value");

    testresults.Add("Test2Key", innertestresults);

    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string json = serializer.Serialize(testresults);

    return json;
}

希望这会有所帮助。

修改(根据评论)

好的,花了一点时间研究这个,似乎你需要明确声明使用ServiceKnownType属性进行序列化时对象图中会出现的类型。

ServiceKnownType需要添加为您服务的属性,在您的情况下,您需要声明Dictionary<string, string>类型,如下所示:

[ServiceKnownType(typeof(Dictionary<string, string>))]
[ServiceContract(Namespace = "WebApplication1")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service...

答案 1 :(得分:0)

我正在敲打类似的问题,当服务执行时没有任何异常,但是ajax调用没有执行成功方法,并且在每个浏览器中,错误消息不一致。

当我回到词典时。我的对象类有一些DateTime类型的属性。我在谷歌上发现了很少关于JSON和C#中的DateTime格式的帖子。我将这些属性从DateTime更改为string并工作。

问候。