如何将json反序列化为.net类型并将其作为字符串返回
我试图使用Fiddler发送POST请求,如下所示:
POST http://localhost:50196/api/values/json HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json;
Host: localhost:50196
Content-Length: 73
{"ssn":1605789787,"creditScore":598,"loanAmount":10.0,"loanDuration":360}
这是我的WebAPI控制器,我将它反序列化为.NET类型,这是我的POCO。 然后我得到ssn并产生一个我想要返回的速率。
public class ValuesController : ApiController
{
[ActionName("json")]
public string Post(string request)
{
var json = JsonConvert.DeserializeObject<JsonModel>(request);
var ss = json.Ssn;
var random = new Random();
var interestRate = random.Next(100, 500);
var rate = interestRate / 100;
var delta = "{"ssn":" + ss + ","interestRate":" + rate + "}";
return delta;
}
}
POCO:
public class JsonModel
{
[JsonProperty("ssn")]
public string Ssn { get; set; }
[JsonProperty("creditScore")]
public int CreditScore { get; set; }
[JsonProperty("loanAmount")]
public decimal LoanAmount { get; set; }
[JsonProperty("loanDuration")]
public int LoanDuration { get; set; }
}
WebAPI配置:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new {action = @"[a-zA-Z]+", id = @"*"}
);
}
这是我得到的错误:
[HttpException]:路径'/ api / values / json'的控制器未找到或未实现IController。 ved System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,Type controllerType)ved System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,String controllerName)ved System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext,IController&controller ,IControllerFactory&factory)ved System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback callback,Object state)ved System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext,AsyncCallback callback,Object state)ved
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext上下文,AsyncCallback cb,Object extraData)ved
System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()ved System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)
首先,您完全错过了ASP.NET MVC模型绑定功能,而不是接受操作中的JSON字符串,然后反序列化,只是期待模型并让框架为您执行绑定,例如
public HttpResponseMessage Post(JsonModel model)
{
...
}
其次,你的例外是由于路由问题。 您正试图发布到api/values/json
,这相当于api/{controller}/{action}
。 但是,正如您所看到的,您没有映射到该特定路由的操作,因为您的唯一路由需要一个id
参数(但操作包含request
参数)。
切换到在视图中直接使用模型应该足以解决这个问题,并应该直接发布到api/values/json
。
我认为{ id = RouteParameter.Optional }
是可选的,因为它可以接受ID
通常情况就是这样,然而,在你的路由中,你有一个设置在id
上的约束,它表示它必须包含一些值 - 这会使你的默认值过时。
我认为你的控制器可以直接接受你的POCO类型,不需要手工串连字符串:
public HttpResponseMessage Post(HttpRequestMessage request, [FromBody]JsonModel)
不过,我不确定那是什么问题。 在使用WebAPI时,我会远离ActionName属性。 我认为使用简单的Get / Post等方法为每种类型设置单独的控制器会更清晰。 所以,在你的情况下:
控制器:
public HttpResponseMessage Post(HttpRequestMessage request, [FromBody]JsonModel)
{}
然后你只需发布到:
api/values
...最后,你的路线配置:
routeTemplate: "api/{controller}/{id}"
链接地址: http://www.djcxy.com/p/36809.html
上一篇: How to deserialize json to .net type and return it as string