我希望这很简单,对于其他开发人员来说必须是常见的情况。
我正在从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)
从数据层发送它时并使用
var output = await response.Content.ReadAsAsync<SQLErrorHandler>();
输出变量再次具有许多额外的字符,然后我需要再次处理。对我有用的唯一方法是使用httpresults.ok(Object)和在我的BusinessLayer中读取该对象。我不想这样做,因为它不是错误的返回类型。
我在做对吗?我有两个问题:
- 是否有一种方法可以使给定的字符串进行估算并使用向商业layer列而没有字符串处理?
- 如果不可能,我可以简单地将字符串传递给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