我有一个最初返回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;
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);
}
注意,这将返回一个string
,格式为JSON。
如果我将其切换到IHttpActionResult
,无论我尝试什么,它似乎都会失败。我可以离开它(它工作),但我应该使用最佳实践,这和IHttpActionResult
似乎是我应该使用的。
我试过return Json(json);
,但这导致无效的,不可解析的JSON,大概是因为它试图做双重转换?return Ok(json);
导致JSON字符串被 Package 在XML中。
什么是正确的方法来做到这一点?
编辑:
我已经成功地将这个项目中的每个方法都转换为使用IHttpActionResult,除了这个特定的方法。
这是一个通用树到JSON的序列化。不管我尝试什么方法,我都得到了无效的JSON。HttpResponseMsessage
方法工作得很好,但我无法用IHttpActionResult
获取有效的JSON。
9条答案
按热度按时间fsi0uk1n1#
您可以创建自己的IHttpActionResult类示例来返回JSON,并在控制器或基本控制器类中创建一个方法来使用它。
创建IHttpActionResult示例,用于设置内容和状态代码:
向控制器中添加一个方法以创建结果。下面是一个Web API示例:
at0kjp5o2#
另一项建议如下:
zpqajqem3#
我也遇到了同样的问题,这段代码对我有效(使用Newtonsoft.Json nuget包来反序列化json):
似乎我们必须有一个对象才能让Json()正常工作。
v8wbuo2f4#
这里的一些解决方案是将
string
转换为JSON
,这不是必需的。你只是在白白地使用计算机资源。客户端另一种解决方案
您可以做一个小的更改,以准备接收字符串并在必要时转换它。下面的代码是JavaScript
yrdbyhpb5#
如果你不打算使用XML作为返回类型,你也可以在WebApiConfig中删除XmlFormatter:
lpwwtiir6#
正确的方法是返回:
Ok(json);
它将结果转换为XML,因为这是默认的接受返回类型。尝试添加:
Accept: application/json
到你的API请求头,我认为这应该解决这个问题。bqucvtff7#
我在使用XML标记返回JSON字符串时遇到了同样的问题。我尝试了所有简单的解决方案,比如:
return Json(text),json反序列化并添加config.Formatter for json,但这并没有帮助。我在json对象周围得到了两个cote,或者它是畸形的。
只有TGRA编写的解决方案对我有效。
创建自己的IHttpActionResult类示例以返回JSON
mklgxw1f8#
对我来说,返回IHttpActionResult的唯一方法是下面的Json字符串内容。
qmb5sa229#
对于IActionResult来说,这是一个非常简单的方法,几乎不使用任何资源: