나는 매우 간단하고 다른 개발자에게는 공통된 시나리오 여야합니다.에있는 이스케이프 문자로 문자열을 비 직렬화하는 동안 오류가 발생했습니다.
오류 세부 정보가 포함 된 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에서 읽는 것입니다. 나는 오류의 경우 올바른 반환 유형이 아니므로 수행하고 싶지 않습니다.
내가 제대로하고 있습니까?
- 지정된 문자열을 역 직렬화하고 처리 문자열없이 BusinessLayer에 을 사용하여 보내 할 수있는 방법이 있나요 : 나는이 개 질문이?
- 처음으로 문자열을 전달할 수 없다면 문자열을 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}"
을 보냅니다. 그것을 보내고 제안 된대로 변환하는 더 깨끗한 방법이 있습니까? 나는 이것들이 별개의 문제이기 때문에 이것에 대한 간단한 질문을 게시해야한다고 생각한다. 나는 그것을하기위한 최선의 방법이 무엇인지 정말로 알고 싶다.
당신은'JsonConvert.DeserializeObject <목록> (string_from_stored_proc)를 시도? –
Equalsk
SQL 문자열의 내용이'['및']'이므로 목록/배열 유형을 찾고 있습니다. 제거한 다음 역 직렬화하십시오. –
@ Equalsk - 감사합니다. 그것은 트릭을했다. 나는 어떻게 든 저장 프로 시저에서 반환 변수 세트가 varchar (C# 모델의 문자열) 일 때도 목록을 반환한다는 것을 무시했습니다. – sandiejat