在Web Api控制器中将JSON反序列化为字典

时间:2014-04-10 12:36:34

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

我有这样的JSON字符串: '{"1":[1,3,5],"2":[2,5,6],"3":[5,6,8]}'

我想将其发送到Web Api控制器而不使用ajax请求更改:

   $.ajax({
        type: "POST",
        url: "Api/Serialize/Dict",
        data: JSON.stringify(sendedData),
        dataType: "json"
    });

在Web Api中我有这样的方法:

    [HttpPost]
    public object Dict(Dictionary<int, List<int>> sendedData)
    {
        //code goes here
        return null;
    }

总是sendedData == null.另外一句话:我不知道如何将JSON反序列化为(Dictionary<int, List<int>>

感谢您的回答。

6 个答案:

答案 0 :(得分:1)

试试这个

 [HttpPost]
    public object Dict(Dictionary<int, List<int>> sendedData)
    {
       var d1 = Request.Content.ReadAsStreamAsync().Result;
       var rawJson = new StreamReader(d1).ReadToEnd();
       sendedData=Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<int, List<string>>>(rawJson);

    }

答案 1 :(得分:1)

您可以像这样发送数据:

{"sendedData":[{"key":"1","value":[1,3,5]},{"key":"2","value":[2,5,6]},{"key":"3","value":[5,6,8]}]}

控制器中功能的图像: Dict

答案 2 :(得分:0)

试一试:

Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<int, List<string>>>("{'1':[1,3,5],'2':[2,5,6],'3':[5,6,8]}");

答案 3 :(得分:0)

尝试使用:

public ActionResult Parse(string text)
{
    Dictionary<int, List<int>> dictionary = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<int, List<int>>>(text);
    return Json(dictionary.ToString(), JsonRequestBehavior.AllowGet);
}

当发送的数据在索引周围没有引号时,这是有效的:

{1:[1,3,5],2:[2,5,6],3:[5,6,8]}

还要确保在Javascript中发送对象:

data: { 
    text: JSON.stringify(sendedData)
},

答案 4 :(得分:0)

在执行ajax调用时指定内容类型参数,dataType用于返回结果:

$.ajax({ 
       type: "POST",
       url: "Api/Serialize/Dict", 
       contentType: "application/json; charset=utf-8", //!
       data: JSON.stringify(sendedData) 
});

答案 5 :(得分:0)

您错过了sendedData参数中的[FromBody]批注。试试这个:

[HttpPost]
[Consumes("application/json")]
[Produces("application/json")]
public object Dict([FromBody] Dictionary<int, List<int>> sendedData)
{
    //code goes here
    return null;
}