2017-02-28 3 views
0

나는 매우 간단하고 다른 개발자에게는 공통된 시나리오 여야합니다.에있는 이스케이프 문자로 문자열을 비 직렬화하는 동안 오류가 발생했습니다.

오류 세부 정보가 포함 된 SQL에서 OUT 변수를 보냅니다. 내 데이터 영역의 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의 디버거가 문자열로 이스케이프()를 추가하는 것으로 알고 있습니다.

JsonConvert.DeserializeObject<my_error_object>(string_from_stored_proc); 

나는이 오류를 얻을 : 내가 사용이 문자열을 역 직렬화 할 때

{"Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'BaaS.DTO.SQLErrorHandler' because the type requires a JSON object (e.g. {\"name\":\"value\"}) to deserialize correctly.\r\nTo fix this error either change the JSON to a JSON object (e.g. {\"name\":\"value\"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.\r\nPath '', line 1, position 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을 처리하고 모든 백 슬래시를 제거하려하지만 난이 예상되는 동작이 생각 이스케이프 문자를 (제거 할 수 없습니다). 이러한 슬래시를 사용하면 직렬화 된 문자열을 가져올 수 없습니다.

해결 방법 : 시작 중괄호를 제거하면

{[ 
    { 
    "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를 사용하여 직렬화 수 있어요 : 나는 var outputJson = Newtonsoft.Json.Linq.JToken.Parse(string_from_stored_proc);를 사용하는 경우는 출력에게 아래의 출력을 제공 . 내가 BadRequest(deserialized_string_from_stored_proc) 를 사용하여 데이터 영역에서 보내고

var output = await response.Content.ReadAsAsync<SQLErrorHandler>(); 

출력 변수를 사용하여 BusinessLayer에서 검색 할 때

그러나, 다시 내가 다시 처리해야 여분의 문자를 많이 가지고있다. 나에게 맞는 유일한 방법은 HttpResults.OK (객체)를 사용하여 직렬화 해제 된 객체를 보내고 BusinessLayer에서 읽는 것입니다. 나는 오류의 경우 올바른 반환 유형이 아니므로 수행하고 싶지 않습니다.

내가 제대로하고 있습니까?

  1. 지정된 문자열을 역 직렬화하고 처리 문자열없이 BusinessLayer에 을 사용하여 보내 할 수있는 방법이 있나요 : 나는이 개 질문이?
  2. 처음으로 문자열을 전달할 수 없다면 문자열을 BusinessLayer로 전달하고 거기에 역 직렬화하면됩니까?

오류를 재현하기 위해 더 많은 정보 또는 코드 스 니펫을 제공해 드리겠습니다.

편집 : @ Equalsk 님의 제안에 따라 제대로 역 직렬화 할 수있었습니다. 그러나 현재 Datalayer에 있습니다.출력은 다음과 같습니다.

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

그러나 나는 여전히 선호하는 방법 (# 2)을 수행 할 수 없습니다. 내가 return BadRequest(string_from_stored_proc)를 사용하여 BusinessLayer에 문자열을 보내는 경우가 나는 아직도 그것을 처리 할 필요가

"{\r\n \"message\": \"[{\\"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}]\"\r\n}"

을 보냅니다. 그것을 보내고 제안 된대로 변환하는 더 깨끗한 방법이 있습니까? 나는 이것들이 별개의 문제이기 때문에 이것에 대한 간단한 질문을 게시해야한다고 생각한다. 나는 그것을하기위한 최선의 방법이 무엇인지 정말로 알고 싶다.

+1

당신은'JsonConvert.DeserializeObject <목록 > (string_from_stored_proc)를 시도? – Equalsk

+2

SQL 문자열의 내용이'['및']'이므로 목록/배열 유형을 찾고 있습니다. 제거한 다음 역 직렬화하십시오. –

+0

@ Equalsk - 감사합니다. 그것은 트릭을했다. 나는 어떻게 든 저장 프로 시저에서 반환 변수 세트가 varchar (C# 모델의 문자열) 일 때도 목록을 반환한다는 것을 무시했습니다. – sandiejat

답변

1

비슷한 물건으로 붙어 있습니다. 당신의 DL의 출력을 얻으려면, 당신은 다음과 반환 할 수 있습니다 : DL FROM

(호출/초) API 예를 들어

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

: 지금

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

을 BL (우선/소명에) API에서 StatusCode가 Success가 아니면 응답 결과를 읽습니다. 이처럼 :;`

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 
+0

그게 도움이. 콘텐츠 전달은 상태 코드와 함께 사용자 정의 오류/메시지를 지원하므로 더 좋습니다. – sandiejat