2017-05-05 1 views
0

웹 API (웹 API 2)를 사용하여 데이터를 가져 오는 콘솔 응용 프로그램을 작성했습니다. 콘솔 응용 프로그램은 복잡한 객체를 웹 API에 전달합니다 (지금까지는 문제 없음). 데이터를 serialize/deserialize 할 때 Newtonsoft json을 사용하고 있습니다. 문제는 콘솔 응용 프로그램에서 반환 데이터를 deserialize하면 사용할 수 없게됩니다. 아래는 데이터가Newtonsoft가 작동하지 않는 상태에서 Json을 직렬화하지 않음

[\ "JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA1MDUxMjM2MzYtMDQnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCi9Qcm9kdWNlcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCj4 + CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4 + CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlL1BhZ2VzCi9Db3VudCAxCi9LaWRzWzcgMCBSXQo + PgplbmRvYmoKNCAwIG9iagpbCi9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSQpdCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHlwZTEKL0Jhc2VGb250L0hlbHZldGljYQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nCj4 + CmVuZG9iago2IDAgb2JqCjw8Ci9MZW5ndGggMTM4Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtClgJ4 + UqVDA30jMAEgomZhZAhpkJiCxKVQhXyOMFyhoZWOpZmimYGVromRopgJUYGekZG8GVOIUo6LsZKxgaKISkKRiAYVG6gompkZ65oYVCiA/EBJBeY0M9oECKgoZjmKOCpkJIlkKIloJrCClGGBnomZmAzX을 returned-입니다 AO8g93cQ1CNiYQjPB7KBAAubYyZAplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwKL1BhcmVudCAzIDAgUgovVHlwZS9QYWdlCi9NZWRpYUJveFswIDAgNjEyIDc5Ml0KL1Jlc291cmNlcwo8PAovUHJvY1NldCA0IDAgUgovWE9iamVjdAo8PAo + PgovRm9udAo8PAovRjMgNSAwIFIKPj4KPj4KL0NvbnRlbnRzIDYgMCBSCi9Hcm91cAo8PAovQ1MvRGV2aWNlUkdCCi9TL1RyYW5zcGFyZW5jeQo 만일 go + + + PgplbmRvYmoKeHJlZgowIDgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxNzYgMDAwMDAgbiAKMDAwMDAwMDIyNCAwMDAwMCBuIAowMDAwMDAwMjc5IDAwMDAwIG4gCjAwMDAwMDAzMjkgMDAwMDAgbiAKMDAwMDAwMDQyMiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCnRyYWlsZXIKPDwKL0lEWzwwNUY3MTFDRjlGRjFDRTRFQTUwNjIxMUNGNzhEQzRBRT48MDVGNzExQ0Y5RkYxQ0U0RUE1MDYyMTFDRjc4REM0QUU XQovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovU2l6ZSA4Cj4 + CnN0YXJ0eHJlZgo4MjgKJSVFT0YK \ "]가 역 직렬화 후 바이트 배열의 ArrayList를 반환되어야

데이터. 오류 값 변환 그러나 아래 에러 대신

형 'Newtonsoft.Json.JsonSerializationException'처리되지 않은 예외 deserialize-하려고시 발생

추가 정보 Newtonsoft.Json.dll

발생한 "["JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA1MDUxMjQ0NTQtMDQnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCi9Qcm9kdWNlcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCj4 CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4 + + + CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlL1BhZ2VzCi9Db3VudCAxCi9LaWRzWzcgMCBSXQo PgplbmRvYmoK NCAwIG9iagpbCi9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSQpdCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHlwZTEKL0Jhc2VGb250L0hlbHZldGljYQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nCj4 + CmVuZG9iago2IDAgb2JqCjw8Ci9MZW5ndGggMTM4Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtClgJ4 + UqVDA30jMAEgomZhZAhpkJiCxKVQhXyOMFyhoZWOpZmimYGVromRopgJUYGekZG8GVOIUo6LsZKxgaKISkKRiAYVG6gompkZ65oYVCiA/EBJBeY0M9oECKgoZjmKOCpkJIlkKIloJrCClGGBnomZmAzXAO8g93cQ1CNiYQjPB7KBAAubYyZAplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwKL1BhcmVudCAzIDAgUgovVHlwZS9QYWdlCi9NZWRpYUJveFswIDAgNjEyIDc5Ml0KL1Jlc291cmNlcwo8PAovUHJvY1NldCA0IDAgUgovWE9iamVjdAo8PAo + PgovRm9udAo8PAovRjMgNSAwIFIKPj4KPj4KL0NvbnRlbnRzIDYgMCBSCi9Hcm91cAo8PAovQ1MvRGV2aWNlUkdCCi9TL1RyYW5zcGFyZW5jeQo + 만일 go + PgplbmRvYmoKeHJlZgowIDgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxNzYgMDAwMDAgbiAKMDAwMDAwMDIyNCAwMDAwMCBuIAowMDAwMDAwMjc5IDAwMDAwIG4gCjAwMDAwMDAzMjkgMDAwMDAgbiAKMDAwMDAwMDQyMiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCnRyYWlsZXIKPDwKL0lEWzxDNjNFQUM2RDc2QTJEMjRB OTI3OEY0Q0ZDNTExQjI4RD48QzYzRUFDNkQ3NkEyRDI0QTkyNzhGNENGQzUxMUIyOEQ + XQovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovU2l6ZSA4Cj4 + CnN0YXJ0eHJlZgo4MjgKJSVFT0YK "]" 는 'System.Collections.ArrayList'를 입력합니다. 경로 ', 1 줄, 위치 1524다음은

  using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace RENO_BatchPrintGenerator.PropertyClasses 
{ 
    #region "BatchPrintBatchInfo" 
    [Serializable()] 
    public class BatchPrintBatchInfo 
    { 

     // local property declarations 
     int _id; 
     int _renoBatchPrintCategoryID; 
     Nullable<DateTime> _createdDate; 
     Nullable<DateTime> _deletedDate; 
     string _batchType; 
     int _printCount; 
     DateTime _requestDate; 
     Nullable<DateTime> _lastPrintDate; 
     Nullable<DateTime> _lastLabelsPrintDate; 
     int _userId; 
     string _userFullname; 
     string _filename; 
     string _filenameLabels; 

     bool _notifyUser; 
     #region "Constructors" 
     public BatchPrintBatchInfo() 
     { 
     } 

     public BatchPrintBatchInfo(int renoBatchPrintCategoryID, DateTime createdDate, string batchType, int printCount, DateTime requestDate, int userId, DateTime deletedDate) 
     { 
      this.ID = 0; 
      this.RenoBatchPrintCategoryID = renoBatchPrintCategoryID; 
      this.CreatedDate = createdDate; 
      this.DeletedDate = deletedDate; 
      this.BatchType = batchType; 
      this.PrintCount = printCount; 
      this.RequestDate = requestDate; 
      this.LastPrintDate = null; 
      this.LastLabelsPrintDate = null; 
      this.UserID = userId; 
      this.UserFullname = ""; 
      this.Filename = ""; 
      this.FilenameLabels = ""; 
      this.NotifyUser = false; 
     } 
     #endregion 

     #region "Public Properties" 
     public int ID 
     { 
      get { return _id; } 
      set { _id = value; } 
     } 

     public int RenoBatchPrintCategoryID 
     { 
      get { return _renoBatchPrintCategoryID; } 
      set { _renoBatchPrintCategoryID = value; } 
     } 

     public Nullable<DateTime> CreatedDate 
     { 
      get { return _createdDate; } 
      set { _createdDate = value; } 
     } 

     public Nullable<DateTime> DeletedDate 
     { 
      get { return _deletedDate; } 
      set { _deletedDate = value; } 
     } 

     public string BatchType 
     { 
      get { return _batchType; } 
      set { _batchType = value; } 
     } 

     public int PrintCount 
     { 
      get { return _printCount; } 
      set { _printCount = value; } 
     } 

     public DateTime RequestDate 
     { 
      get { return _requestDate; } 
      set { _requestDate = value; } 
     } 

     public Nullable <DateTime> LastPrintDate 
     { 
      get { return _lastPrintDate; } 
      set { _lastPrintDate = value; } 
     } 

     public Nullable<DateTime> LastLabelsPrintDate 
     { 
      get { return _lastLabelsPrintDate; } 
      set { _lastLabelsPrintDate = value; } 
     } 

     public string UserFullname 
     { 
      get { return _userFullname; } 
      set { _userFullname = value; } 
     } 

     public int UserID 
     { 
      get { return _userId; } 
      set { _userId = value; } 
     } 

     public string Filename 
     { 
      get { return _filename; } 
      set { _filename = value; } 
     } 

     public string FilenameLabels 
     { 
      get { return _filenameLabels; } 
      set { _filenameLabels = value; } 
     } 

     public bool NotifyUser 
     { 
      get { return _notifyUser; } 
      set { _notifyUser = value; } 
     } 
     #endregion 
    } 
    #endregion 
} 
+0

클래스'BatchPrintBatchInfo'에 대한 코드를 추가하십시오. – Gusman

+0

@Gusman - BatchPrintBatchInfo가 추가되었습니다. – Chris

+0

좋아, 당신은 바이트 배열의 ArrayList가 아니라 바이트의 ArrayList 확실합니까? – Gusman

답변

1

당신이보고있는 것은 바이트의 배열이 같은 인쇄 출력을 포함, 어떤 IEnumerable<byte>는 Base64로로서 직렬화됩니다. ArrayListIEnumerable<byte>이 아니고 IEnumerable이 아니므로 디시리얼라이저는 ArrayList 내용이 정의되어 있지 않으므로 Base64 데이터로 수행 할 작업을 알지 못합니다 (object). 당신이 byte[] 또는 List<byte>에 그것을 deserialize하는 경우에 작동 할 것이다. 예를 당

:

byte[] deserialized = JsonConvert.DeserializeObject<byte[]>(result); 

또한, 당신은 ArrayList을 할 수있는만큼을 피하기 List<T>

편집과 같은 실제 배열이나 제네릭 컬렉션을 사용 : 당신은 정말 [] 안에 한 바이트와 ArrayList에 있고, 내 잘못, 다음 올바른 직렬화 코드가 있어야한다 :

List<byte[]> deserialized = JsonConvert.DeserializeObject<List<byte[]>>(result); 

이 전체 테스트 데이터와 함께 일하고있다 :

string data = "[\"JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA1MDUxMjM2MzYtMDQnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCi9Qcm9kdWNlcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlL1BhZ2VzCi9Db3VudCAxCi9LaWRzWzcgMCBSXQo+PgplbmRvYmoKNCAwIG9iagpbCi9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSQpdCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHlwZTEKL0Jhc2VGb250L0hlbHZldGljYQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago2IDAgb2JqCjw8Ci9MZW5ndGggMTM4Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtClgJ4+UqVDA30jMAEgomZhZAhpkJiCxKVQhXyOMFyhoZWOpZmimYGVromRopgJUYGekZG8GVOIUo6LsZKxgaKISkKRiAYVG6gompkZ65oYVCiA/EBJBeY0M9oECKgoZjmKOCpkJIlkKIloJrCClGGBnomZmAzXAO8g93cQ1CNiYQjPB7KBAAubYyZAplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwKL1BhcmVudCAzIDAgUgovVHlwZS9QYWdlCi9NZWRpYUJveFswIDAgNjEyIDc5Ml0KL1Jlc291cmNlcwo8PAovUHJvY1NldCA0IDAgUgovWE9iamVjdAo8PAo+PgovRm9udAo8PAovRjMgNSAwIFIKPj4KPj4KL0NvbnRlbnRzIDYgMCBSCi9Hcm91cAo8PAovQ1MvRGV2aWNlUkdCCi9TL1RyYW5zcGFyZW5jeQo+Pgo+PgplbmRvYmoKeHJlZgowIDgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxNzYgMDAwMDAgbiAKMDAwMDAwMDIyNCAwMDAwMCBuIAowMDAwMDAwMjc5IDAwMDAwIG4gCjAwMDAwMDAzMjkgMDAwMDAgbiAKMDAwMDAwMDQyMiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCnRyYWlsZXIKPDwKL0lEWzwwNUY3MTFDRjlGRjFDRTRFQTUwNjIxMUNGNzhEQzRBRT48MDVGNzExQ0Y5RkYxQ0U0RUE1MDYyMTFDRjc4REM0QUU+XQovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovU2l6ZSA4Cj4+CnN0YXJ0eHJlZgo4MjgKJSVFT0YK\"]"; 

List<byte[]> datdes = Newtonsoft.Json.JsonConvert.DeserializeObject<List<byte[]>>(data); 
2

당신이 볼 것은 base64로 인 코드 - 웹 API-

public class BatchController : ApiController 
{ 
    [ActionName("DoBatchWork")] 
    [HttpPost] 
    public string DoBatchWork([FromBody]JObject jWork) 
    { 
     JObject s = JObject.Parse(jWork.ToString()); 

     BatchPrintBatchInfo objWork = JsonConvert.DeserializeObject<BatchPrintBatchInfo>(s.ToString()); 
     ArrayList aryWork = DocumentByBatchReports.CreateBatchReport(objWork); 
     string a = JsonConvert.SerializeObject(aryWork); 
     return a; 

    } 

} 

WEB으로 일자리

public static ArrayList DoBatchWork(BatchPrintBatchInfo Work) 
    { 
     HttpClient client = new HttpClient(); 

     var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(Work), Encoding.UTF8, "application/json"); 
     string result = SendRequest("Batch/DoBatchWork", content, HttpMethod.Post); 

     //******FAILS HERE************* 
     ArrayList deserialized = Newtonsoft.Json.JsonConvert.DeserializeObject<ArrayList>(result); 


     return deserialized; 
    } 

    public static string SendRequest(string requestUrl, StringContent content, HttpMethod httpMethod) 
    { 
     var client = new HttpClient { BaseAddress = new Uri(serviceUrl) }; 
     var uri = new Uri(serviceUrl + requestUrl); // http://localhost/api/test 

     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     HttpResponseMessage response; 
     response = client.PostAsync(uri, content).Result; 

     if (!response.IsSuccessStatusCode) 
     { 
      throw new ApplicationException(response.ToString()); 
     } 

     string stringResult = response.Content.ReadAsStringAsync().Result; 
     return stringResult; 
    } 

편집 BATCHPRINTBATCHINFO 코드 -에게 있습니다 인코딩 된 형식 에서 해독하려고하면 PDF 파일을 볼 수 있습니다.

대부분의 아마 BatchPrintBatchInfo Work 매개 변수를 PDF

+0

나는 Base64Decode 메서드를 시도하고 디코딩 전에 json 문자를 제거했습니다. 나는 부분적으로 읽을 수있는 텍스트를 얻었고 당신이 말하는 것처럼 PDF를 가리키는 것처럼 보였다. 그러나 바이트 배열의 배열 목록을 반환하는 메서드를 사용하여이 작업을 수행하고 싶습니다. – Chris

+0

바이트 배열의 목록은 무엇입니까? – Max

+0

SSRS 보고서는 바이트 배열로 변환되어 PDF 형식으로 NAS 드라이브에 기록됩니다. – Chris

관련 문제