带有JSON字符串

时间:2016-03-26 21:27:23

标签: c# json json.net

我有一个最初返回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。

7 个答案:

答案 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