C# 反序列化包含转义字符的字符串时出错
我希望这是一个非常简单的东西,必须是其他开发人员的常见场景 我正在从SQL发送一个OUT变量,其中包含错误详细信息。在我的DataLayer API中,我在VS Debugger中检查它,它就是这样显示的:C# 反序列化包含转义字符的字符串时出错,c#,json,json.net,asp.net-web-api2,deserialization,C#,Json,Json.net,Asp.net Web Api2,Deserialization,我希望这是一个非常简单的东西,必须是其他开发人员的常见场景 我正在从SQL发送一个OUT变量,其中包含错误详细信息。在我的DataLayer API中,我在VS Debugger中检查它,它就是这样显示的: var string_from_stored_proc = "[{\"errornumber\":2627,\"errormessage\":\"Violation of UNIQUE KEY constraint 'KEY_Subject'. Cannot insert duplicate
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调试器将转义()添加到字符串中。当我尝试使用以下命令反序列化此字符串时:
JsonConvert.DeserializeObject<my_error_object>(string_from_stored_proc);
我试图从_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(从\u stored\u proc反序列化的\u string\u)从数据层发送它时,
并在BusinessLayer中使用
var output = await response.Content.ReadAsAsync<SQLErrorHandler>();
var output=wait response.Content.ReadAsAsync();
输出变量又有很多额外的字符,我需要再次处理这些字符。对我来说唯一有效的方法是使用HttpResults.OK(object)发送反序列化对象,并在我的BusinessLayer中读取它。我不想这样做,因为在发生错误时,它不是正确的返回类型
我做得对吗?我有两个问题:
有没有办法反序列化给定字符串并使用
到BusinessLayer而不进行字符串处理李>
如果第一个不可能,我可以简单地将字符串传递给
BusinessLayer并在那里反序列化(首选方式)
我很乐意提供更多信息或代码片段来重现错误
编辑:
根据@Equalsk的建议,我已经能够正确地反序列化它。然而,目前它在数据层中。以下是输出:
var equalskObj = JsonConvert.DeserializeObject<List<SQLErrorHandler>>(outputFromSP.Value.ToString());
return Ok(equalskObj);
var equalskObj=JsonConvert.DeserializeObject(outputFromSP.Value.ToString());
返回Ok(equalskObj);
但是,我仍然不能用首选的方法(#2)。如果我使用return BadRequest(string\u from\u stored\u proc)将字符串发送到BusinessLayer,它将发送
“{\r\n\”消息\”:
\[{\\“errornumber\\”:2627,\\“errormessage\\”:\\“违反
唯一密钥约束“密钥\主题”。无法在中插入重复密钥
对象“edu.Subject”。重复的键值为(MATS10,
2) .\\“,\\\“errorstate\\”:1,\\“errorseverity\\”:14,\\“errorline\\”:36,\\“ErrorProcedure\\”:\\“SPCreateSubject\\”,\\“xactstate\\”:1}]\“\r\n}”
我仍然需要处理它。是否有一种更干净的方法将其发送过来,然后按照建议进行转换?我想我应该为此发布一个简化的问题,因为这些是独立的问题。我真的很想知道做这件事的最佳方法是什么。我也遇到了类似的问题。要从DL获取输出,可以按如下方式返回:
来自DL(调用/秒)API
现在在BL(First/Calling)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
我也被类似的事情缠住了。要从DL获取输出,可以按如下方式返回:
来自DL(调用/秒)API
现在在BL(First/Calling)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
您是否尝试过JsonConvert.DeserializeObject(存储过程中的字符串)代码>?它正在查找列表/数组类型,因为SQL字符串的内容周围有[
和]
。删除这些,然后反序列化。@Equalsk-非常感谢。它成功了。我不知何故忽略了它正在返回一个列表,即使存储过程中设置的返回变量是varchar(C#model中的字符串)。但是,我仍然坚持使用return Ok(object),而不能使用BadRequest(string_from_storage_proc)发送一个干净的错误字符串,并在BusinessLayer中对其进行反序列化。我已经用输出更新了问题。再次感谢@MikeMcCaughan-虽然你的答案是有效的,但这并不是我首先想做的事情,因为它涉及到手动字符串处理。你是否尝试过jsonvert.DeserializeObject(string_from_stored_proc)代码>?它正在查找列表/数组类型,因为SQL字符串的内容周围有[
和]
。删除这些,然后反序列化。@Equalsk-非常感谢。它成功了。我不知何故忽略了它正在返回一个列表,即使存储过程中设置的返回变量是varchar(C#model中的字符串)。但是,我仍然坚持使用return Ok(object),而不能使用BadRequest(string_from_storage_proc)发送一个干净的错误字符串,并在BusinessLayer中对其进行反序列化。我已经用输出更新了问题。再次感谢@MikeMcCaughan-虽然你的答案是有效的,但这并不是我想首先做的事情,因为它涉及到手动字符串处理。这很有帮助。传递内容更好,因为它支持自定义错误/消息以及状态代码。这很有帮助。传递内容更好,因为它支持自定义错误/消息以及状态代码。
Return Content(System.Net.HttpStatusCode.BadRequest, e.Message.ToString());
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