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

Posted

技术标签:

【中文标题】在 Web Api 控制器中将 JSON 反序列化为字典【英文标题】:Deserialize JSON into dictionary in Web Api controller 【发布时间】:2014-05-24 04:10:00 【问题描述】:

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

我想将其发送到 Web Api Controller 而不使用 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&lt;int, List&lt;int&gt;&gt;

谢谢你的回答。

【问题讨论】:

试图解决这个问题一段时间 - 然后阅读:***.com/questions/4710729/post-json-dictionary 是的,Web API 上的 JSON 似乎已损坏。 【参考方案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);

    

【讨论】:

试试String rawJson = Request.Content.ReadAsStringAsync().Result;【参考方案2】:

您可以这样发送数据:

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

控制器中的功能图像: Dict

【讨论】:

【参考方案3】:

试试看:

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

【讨论】:

【参考方案4】:

尝试使用:

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)
,

【讨论】:

【参考方案5】:

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

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

【讨论】:

他的问题是他正在构建的 ajax 调用,而不是服务器端。他使用了 dataType(用于结果),其中 contentType 应指定为 application/json。我已经在他的另一个类似的帖子中回答了他(他有两个),在这里为那些试图找出问题的人复制了答案。不过,其中一个线程应该作为重复关闭。【参考方案6】:

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

[HttpPost]
[Consumes("application/json")]
[Produces("application/json")]
public object Dict([FromBody] Dictionary<int, List<int>> sendedData)

    //code goes here
    return null;

【讨论】:

以上是关于在 Web Api 控制器中将 JSON 反序列化为字典的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将 JSON 数组反序列化为对象

将多个对象从Angular控制器POST到Web API 2

如何手动反序列化 JSON 并像 Web API 那样自动验证模型?

反序列化 Web.API 参数时未调用自定义 Json.NET JsonConverter

反序列化 Json usinc C#, web api, asp.net mvc

在 Web.API 控制器中自动反序列化为类似字符串的类