Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化包含转义字符的字符串时出错_C#_Json_Json.net_Asp.net Web Api2_Deserialization - Fatal编程技术网

C# 反序列化包含转义字符的字符串时出错

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

我希望这是一个非常简单的东西,必须是其他开发人员的常见场景

我正在从SQL发送一个OUT变量,其中包含错误详细信息。在我的DataLayer API中,我在VS Debugger中检查它,它就是这样显示的:

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