我有一个最初返回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字符串以XML格式包装。
这样做的正确方法是什么?
修改
我已成功将此项目中的每个方法转换为使用IHttpActionResult,但此特定方法除外。
它是通用树到JSON的序列化。无论我尝试什么方法,我都会找回无效的JSON。 HttpResponseMsessage
方法工作正常,但我无法通过IHttpActionResult
获得有效的JSON。
答案 0 :(得分: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;
}
}
向控制器添加方法以创建结果。这是一个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);
}
}
答案 1 :(得分:4)
另一项建议如下;
var json = JToken.FromObject(yourObject);
return Ok(json);
答案 2 :(得分:1)
如果您不打算将XML用作返回类型,则还可以删除WebApiConfig中的XmlFormatter:
config.Formatters.Remove(config.Formatters.XmlFormatter);
答案 3 :(得分:1)
晚安。我遇到了同样的问题,这段代码对我有用(使用Newtonsoft.Json nuget包来反序列化json):
var unserializedContent = JsonConvert.DeserializeObject(json);
return Json(unserializedContent);
似乎我们必须有一个对象,以便Json()能够正常工作。
答案 4 :(得分:1)
此处的某些解决方案将string
转换为JSON
,这不是必需的。
您只是无所事事地使用计算机资源。
// Instead off
// return Ok(jsonstring);
// do:
HttpResponseMessage response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonstring, Encoding.UTF8, "application/json");
Request.RegisterForDispose(response); //To avoid the Pragma CA2000 warning
return ResponseMessage(response);
另一种客户端解决方案
您可以进行一些小的更改,以准备接收字符串并在必要时进行转换。下面的代码是Javascript
var data;
if (typeof weapiresponse == "string")
data = JSON.parse(weapiresponse);
else
data = weapiresponse;
答案 5 :(得分:0)
正确的方法是返回:
$memberList = $request->input('members');
DB::table("conversations")->where('members', '=', DB::raw('CAST(\''.$memberList.'\'AS JSON'))->get();
它将结果转换为XML,因为这是默认接受的返回类型。尝试添加:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 (SQL: select * from `conversations` where `members` = CAST('[1,2,3]'AS JSON)
在您的API请求标头中,我认为应该可以解决问题。
答案 6 :(得分:0)
我在Web服务中返回XML标记中的JSON字符串时遇到了同样的问题。我尝试了所有简单的解决方案,如:
返回Json(文本),json反序列化并为json添加config.Formatter,但这没有用。我在json对象周围有双骰子,或者它是畸形的。
只有TGRA编写的解决方案适合我。
创建自己的IHttpActionResult类实例以返回JSON