使用 NewtonSoft 将从 API 检索的 json 转换为 C# 类时出错



这个问题的2个部分。

我是 API 的所有者,如果没有要返回的数据(基于业务规则),则响应将按如下方式传递:

var resp = new { error = "", code = (int)HttpStatusCode.OK, data = leads};
var json = JsonConvert.SerializeObject(resp);
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
return Ok(json);

当我在邮递员中调用它时,它被渲染为:

"{"error":"","code":200,"data":[]}"

斜杠是怎么回事?

我的第二部分(可能会也可能不会通过修复斜杠来修复)是当我使用 API 并反序列化对对象的响应时,我收到以下错误

将值"{"error":","code":200,"data":[]}"转换为键入"DataTypes.IntegrationResponse"时出错。路径 '',第 1 行,位置 43。

对于那些需要它的人,集成响应是:

public class IntegrationResponse
{
    public string error { get; set; }
    public int code { get; set; }
    public List<IntegrationLead> data { get; set; }
}
如果

可以的话,我会对此发表评论,需要更多的代表。 可是-

尝试将List<IntegrationLead>设为InegrationLead[],所有的斜杠都是为了转义引号,你有一个很棒的名字。 干杯!

这是我将如何做到这一点在 APi 中

public ActionResult SomeActionMethod() {
  return Json(new {foo="bar", baz="Blech"});
}

如果你想使用JsonConverter并控制数据如何被丝化,那么

  public class JsonNetResult : ActionResult
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonNetResult"/> class.
        /// </summary>
        public JsonNetResult()
        {
        }
        /// <summary>
        /// Gets or sets the content encoding.
        /// </summary>
        /// <value>The content encoding.</value>
        public Encoding ContentEncoding { get; set; }
        /// <summary>
        /// Gets or sets the type of the content.
        /// </summary>
        /// <value>The type of the content.</value>
        public string ContentType { get; set; }
        /// <summary>
        /// Gets or sets the data.
        /// </summary>
        /// <value>The data object.</value>
        public object Data { get; set; }

        /// <summary>
        /// Enables processing of the result of an action method by a custom type that inherits from the <see cref="T:System.Web.Mvc.ActionResult"/> class.
        /// </summary>
        /// <param name="context">The context in which the result is executed. The context information includes the controller, HTTP content, request context, and route data.</param>
        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = !String.IsNullOrWhiteSpace(this.ContentType) ? this.ContentType : "application/json";
            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }

            if (this.Data != null)
            {
                response.Write(JsonConvert.SerializeObject(this.Data));
            }
        }
    }

块引用

    public class CallbackJsonResult : JsonNetResult
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        public CallbackJsonResult(HttpStatusCode statusCode)
        {
            this.Initialize(statusCode, null, null);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="description">The description.</param>
        public CallbackJsonResult(HttpStatusCode statusCode, string description)
        {
            this.Initialize(statusCode, description, null);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="data">The callback result data.</param>
        public CallbackJsonResult(object data, HttpStatusCode statusCode = HttpStatusCode.OK)
        {
            this.ContentType = null;
            this.Initialize(statusCode, null, data);
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="description">The description.</param>
        /// <param name="data">The callback result data.</param>
        public CallbackJsonResult(HttpStatusCode statusCode, string description, object data)
        {
            this.Initialize(statusCode, description, data);
        }
        /// <summary>
        /// Initializes this instance.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="description">The description.</param>
        /// <param name="data">The callback result data.</param>
        private void Initialize(HttpStatusCode statusCode, string description, object data)
        {
            Data = new JsonData() { Success = statusCode == HttpStatusCode.OK, Status = (int)statusCode, Description = description, Data = data };
        }
    }
}

然后创建扩展

/// <summary>
/// return Json Action Result
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="o"></param>
/// <param name="JsonFormatting"></param>
/// <returns></returns>
public static CallbackJsonResult ViewResult<T>(this T o)
{
    return new CallbackJsonResult(o);
}

没有 APi 简单地使用您创建的扩展

public ActionResult SomeActionMethod() {
  return new { error = "", code = (int)HttpStatusCode.OK, data = leads}.ViewResult();
}

相关内容

  • 没有找到相关文章

最新更新