我有一个最初返回的方法,HttpResponseMessage我想将其转换为返回IHttpActionResult.
我的问题是当前的代码是使用JSON.Net来序列化一个复杂的通用树结构,它使用JsonConverter我编写的自定义(代码工作正常)很好.
这是它返回的内容:
string json = NodeToJson(personNode);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(json, Encoding.UTF8, "application/json");
return response;
Run Code Online (Sandbox Code Playgroud)
NodeToJson方法是自定义转换器发挥作用的地方......
private static string NodeToJson(Node<Person> personNode) {
var settings = new JsonSerializerSettings {
Converters = new List<JsonConverter> { new OrgChartConverter() },
Formatting = Formatting.Indented
};
return JsonConvert.SerializeObject(personNode, settings);
}
Run Code Online (Sandbox Code Playgroud)
请注意,这将返回a string,格式为JSON.
如果我将其切换到IHttpActionResult,无论我尝试什么,它似乎都会失败.我可以离开它(它有效)但我应该使用最佳实践,IHttpActionResult似乎是我应该使用的.
我试过return Json(json);但这会导致无效的,不可解析的JSON,大概是因为它试图进行双重转换?
return Ok(json); 导致JSON字符串被包装在XML中.
这样做的正确方法是什么?
编辑:
我已经成功地将此项目中的每个方法转换为使用IHttpActionResult,除了这个特殊的方法.
它是JSON的通用树的序列化.无论我尝试什么方法,我都会找回无效的JSON.该HttpResponseMsessage方法工作正常,但我无法获得有效的JSON IHttpActionResult.
小智 10
您可以创建自己的IHttpActionResult类实例以返回JSON以及控制器或基本控制器类中的方法以使用它.
创建设置内容和状态代码的IHttpActionResult实例:
public class JsonTextActionResult : IHttpActionResult
{
public HttpRequestMessage Request { get; }
public string JsonText { get; }
public JsonTextActionResult(HttpRequestMessage request, string jsonText)
{
Request = request;
JsonText = jsonText;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
return Task.FromResult(Execute());
}
public HttpResponseMessage Execute()
{
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(JsonText, Encoding.UTF8, "application/json");
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
向控制器添加方法以创建结果.这是一个Web API示例:
public class MyApiController : ApiController
{
protected internal virtual JsonTextActionResult JsonText(string jsonText)
{
return new JsonTextActionResult(Request, jsonText);
}
[HttpGet]
public IHttpActionResult GetJson()
{
string json = GetSomeJsonText();
return JsonText(json);
}
}
Run Code Online (Sandbox Code Playgroud)
另一个建议如下。
var json = JToken.FromObject(yourObject);
return Ok(json);
Run Code Online (Sandbox Code Playgroud)
小智 2
我遇到了同样的问题,这段代码对我有用(使用 Newtonsoft.Json nuget 包反序列化 json):
var unserializedContent = JsonConvert.DeserializeObject(json);
return Json(unserializedContent);
Run Code Online (Sandbox Code Playgroud)
看来我们必须有一个对象才能让 Json() 正常工作。
| 归档时间: |
|
| 查看次数: |
17771 次 |
| 最近记录: |