C# NancyModule未反序列化JSON正文
我的模块中有一个路由,它应该接受一个代表博客文章的JSON主体。问题是请求主体没有被序列化。如果我调试,我会在请求中看到以下值:C# NancyModule未反序列化JSON正文,c#,.net,json,http,nancy,C#,.net,Json,Http,Nancy,我的模块中有一个路由,它应该接受一个代表博客文章的JSON主体。问题是请求主体没有被序列化。如果我调试,我会在请求中看到以下值: this.Request.Body.Length: 93 x.Keys.Count: 0 路线 Post["/Blog"] = x => { var post = this.Bind<Post>(); //Breakpoint PostService.Save(post);
this.Request.Body.Length: 93
x.Keys.Count: 0
路线
Post["/Blog"] = x =>
{
var post = this.Bind<Post>(); //Breakpoint
PostService.Save(post);
return post;
};
反序列化:
您的代码没有问题,问题是您已经包装了JSON:
您的对象有一个名为Post
的属性,然后它就有了实际的Post
更新您的身体,使其看起来像:
{“Title”:“Hello”,“Content”:“World”,“Created”:“2014-04-26”}
这很可能与Post
对象上的属性相匹配
下面是对客户端的序列化,而不是问题所要求的
序列化: 您需要添加一个
Accept
标题
我在这里写过南希·康涅格:
您的场景不起作用,因为您只是告诉服务器您的内容是什么,而不是您期望得到什么回报
接受
使用Chrome插件-Postman,您可以测试类似于以下内容的场景:
通过将Accept
标题作为application/json
应用,返回的内容将被序列化
.json url
或者,您可以将.json
添加到URL末尾,以json形式返回:
http://yoursite.com/blog.json
Post["/Blog"] = x =>
{
var post = this.Bind<Post>(); //Breakpoint
PostService.Save(post);
return Response.AsJson(post);
};
这将强制JSON序列化程序启动
.AsJson()
如果希望始终返回JSON,则可以使用.AsJson()
Post[“/Blog”]=x=>
{
var post=this.Bind();//断点
PostService.Save(post);
返回Response.AsJson(post);
};
注意,如果您返回的是
动态
类型,则需要强制转换它:返回Response.AsJson((object)post)代码>我现在知道我的问题格式不正确。我的意思是对发送到服务器的JSON主体进行反序列化。我希望将JSON序列化为Post对象。根据文档,反序列化是由内容类型标题触发的,我有这个标题,所以我肯定错过了其他内容。更新到我答案的顶部。到博客帖子的链接被破坏。试试这个:谢谢@norbertson我更新了答案中的链接。
Post["/Blog"] = x =>
{
var post = this.Bind<Post>(); //Breakpoint
PostService.Save(post);
return Response.AsJson(post);
};