反序列化字典返回Null

时间:2015-03-04 23:02:48

标签: c# json serialization asp.net-web-api json.net

我正在使用Web API并尝试接收字典作为参数:

[HttpGet]
public IDictionary<string, string> Get(IDictionary<string,string> myDictionaryAsParameter)

要调用它,我用:

创建一个url查询字符串
string endpoint = "http//localhost:1122/api/MyController/?myDictionaryAsParameter=" + JsonConvert.SerializeObject(parameters)

调试代码时,Web API方法字典参数为Null。

如果我将Web API签名更改为:

[HttpGet]
public IDictionary<string, string> Get(string myDictionaryAsParameter)
{
    var dict = JsonConvert.DeserializeObject(myDictionaryAsParameter);
}

它被正确解析。

我应该如何编码/序列化我的字典对象以在url querystring中发送它并通过Web API方法签名正确解析?

1 个答案:

答案 0 :(得分:1)

如果您使用:

[HttpGet]
[Route("")]
public IDictionary<string, string> Get(IDictionary<string,string> myParameter)
{
}

然后,您必须通过正文传递myDictionaryAsParameter并更改为[HttpPost],因为Web API不支持HttpGet中的正文参数。

我尝试过的一些测试表明只有简单的参数可以通过URL读取,例如

// For URL/value
// I've tried this with complex objects - doesn't work with complex objects

[HttpGet]
[Route("{myParameter}")]
public IDictionary<string, string> Get(string myParameter)
{
}

或:

// For URL?myParameter=value
// Haven't tried this with complex objects - might not work with complex objects

[HttpGet]
[Route("")]
public IDictionary<string, string> Get(string myParameter = "default")
{
}

但是,您可以尝试使用最后一个选项(通过添加默认值)。

此外,Web API的vNext提供了额外的路由选项,您可以尝试使用VS2015和新的Web API版本。