错误的误差,并在其中使用逃生字符进行序列化字符串



我希望这很简单,对于其他开发人员来说必须是常见的情况。

我正在从SQL发送一个输出变量,其中包含错误详细信息。在我的Datalayer API中,我在VS调试器中进行了检查,这就是出现的方式:

var string_from_stored_proc = "[{"errornumber":2627,"errormessage":"Violation of UNIQUE KEY constraint 'KEY_Subject'. Cannot insert duplicate key in object 'edu.Subject'. The duplicate key value is (MATS10, 2).","errorstate":1,"errorseverity":14,"errorline":36,"errroprocedure":"SPCreateSubject","xactstate":1}]"

我知道vs debugger在尝试使用:

试图对此字符串进行测试时,将Escape()添加到字符串中。
JsonConvert.DeserializeObject<my_error_object>(string_from_stored_proc);

我得到此错误:

{"无法对当前的JSON阵列(例如[1,2,3])进行选择 " baas.dto.sqlerrorhandler",因为该类型需要JSON对象 (例如{ {" name ":" value "})要正确挑选。 r n要修复此此事 错误要么将JSON更改为JSON对象(例如 {" name ":" value "})或将避风式类型更改为数组或一个 键入实现集合接口(例如Icollection,iList)的类型 喜欢从JSON阵列中进行的列表。 JSONARRAYATTRIBUTE也可以添加到该类型中,以将其强加于 从json数组中进行验证。 r npath'',第1行,位置1。"}

json2csharp.com无法转换此JSON。如果我删除所有反斜线,则可以完成工作。以下是 my_error_object (或由JSON2SHARP转换)类:

public class my_error_object
{
    public int errornumber { get; set; }
    public string errormessage { get; set; }
    public int errorstate { get; set; }
    public int errorseverity { get; set; }
    public int errorline { get; set; }
    public string errroprocedure { get; set; }
    public int xactstate { get; set; }
}

我尝试处理 String_from_stored_proc 并删除所有后斜切,但我无法删除逃生字符(我认为这是预期的行为)。有了这些斜线,我无法获得符号化。

解决方案:如果我使用var outputJson = Newtonsoft.Json.Linq.JToken.Parse(string_from_stored_proc);,它给出以下输出:

{[
  {
    "errornumber": 2627,
    "errormessage": "Violation of UNIQUE KEY constraint 'KEY_Subject'. Cannot insert duplicate key in object 'edu.Subject'. The duplicate key value is (MATS10, 2).",
    "errorstate": 1,
    "errorseverity": 14,
    "errorline": 36,
    "errroprocedure": "SPCreateSubject",
    "xactstate": 1
  }
]}

删除启动和尾巴后,可以使用newtonsoft进行挑选。

但是,当我使用BadRequest(deserialized_string_from_stored_proc)从数据层发送它时并使用

在BusinessLayer中检索它
var output = await response.Content.ReadAsAsync<SQLErrorHandler>();

输出变量再次具有许多额外的字符,然后我需要再次处理。对我有用的唯一方法是使用httpresults.ok(Object)和在我的BusinessLayer中读取该对象。我不想这样做,因为它不是错误的返回类型。

我在做对吗?我有两个问题:

  1. 是否有一种方法可以使给定的字符串进行估算并使用向商业layer列而没有字符串处理?
  2. 如果不可能,我可以简单地将字符串传递给BusinessLayer并在那里进行挑选(首选)?

我很乐意提供更多信息或代码段来重现错误。

编辑:根据 @equalsk的建议,我能够正确地对其进行正确的序列化。但是,目前在数据层中。这是输出:

var equalskObj = JsonConvert.DeserializeObject<List<SQLErrorHandler>>(outputFromSP.Value.ToString());
return Ok(equalskObj);

但是,我仍然无法执行首选方式(#2)。如果我使用return BadRequest(string_from_stored_proc)将字符串发送给BusinessLayer,则发送

" { r n "消息": " [{\" errornumber \":2627,\" errormessage \":\"违规 唯一的密钥约束" key_subject"。无法插入重复键 对象" edu.subject"。重复的密钥值为(Mats10, 2)。\",\" errorState \":1,\" errorseverity \":14,\" errorline \":36,\" errropropocedure \ \":\ \" spcreateSubject \\\\\\\\",\" xactstate \":1}] " r n}"

我仍然必须处理它。是否有更清洁的方式将其发送到并按建议进行转换?我认为我应该为此发布一个简化的问题,因为这些是单独的问题。我真的很感兴趣地看到什么是最好的方法。

我被类似的事情陷入困境。为了从DL获取输出,您可以如下返回:

来自dl(呼叫/秒)api

return Content(<HttpStatusCode>, "Custom Error Message Here");

例如:

Return Content(System.Net.HttpStatusCode.BadRequest, e.Message.ToString());

现在,在BL(first/呼叫)API中,如果状态代码不成功,请阅读响应结果。这样:

if(!response.IsSuccessStatusCode)
{
    var errorOutput = response.Content.ReadAsStringAsync().Result;
    //Now send this errorOutput from this API to the client. Return an HTTPResult or another Content from here. Upto you!
}
return Ok(); //If response.statuscode is Success

相关内容

  • 没有找到相关文章

最新更新