2017-05-05 2 views
0

Ich schreibe eine Konsolenanwendung, die eine Web-API (Web API 2) verwendet, um Daten abzurufen. Die Konsolenanwendung übergibt ein komplexes Objekt in die Web-API (bisher kein Problem). Ich benutze Newtonsoft json, um Daten serialisieren/deserialisieren. Das Problem ist, dass wenn ich die Rückkehrdaten in der Konsolenanwendung deserialize, es unbrauchbar zurückkommt. Im Folgenden finden Sie die DatenDe-Serialisierung von Json mit Newtonsoft funktioniert nicht

returned-

[\ "JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA1MDUxMjM2MzYtMDQnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCi9Qcm9kdWNlcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCj4 + CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4 + CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlL1BhZ2VzCi9Db3VudCAxCi9LaWRzWzcgMCBSXQo + PgplbmRvYmoKNCAwIG9iagpbCi9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSQpdCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHlwZTEKL0Jhc2VGb250L0hlbHZldGljYQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nCj4 + CmVuZG9iago2IDAgb2JqCjw8Ci9MZW5ndGggMTM4Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtClgJ4 + UqVDA30jMAEgomZhZAhpkJiCxKVQhXyOMFyhoZWOpZmimYGVromRopgJUYGekZG8GVOIUo6LsZKxgaKISkKRiAYVG6gompkZ65oYVCiA/EBJBeY0M9oECKgoZjmKOCpkJIlkKIloJrCClGGBnomZmAzX AO8g93cQ1CNiYQjPB7KBAAubYyZAplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwKL1BhcmVudCAzIDAgUgovVHlwZS9QYWdlCi9NZWRpYUJveFswIDAgNjEyIDc5Ml0KL1Jlc291cmNlcwo8PAovUHJvY1NldCA0IDAgUgovWE9iamVjdAo8PAo PgovRm9udAo8PAovRjMgNSAwIFIKPj4KPj4KL0NvbnRlbnRzIDYgMCBSCi9Hcm91cAo8PAovQ1MvRGV2aWNlUkdCCi9TL1RyYW5zcGFyZW5jeQo + + + Pgo + PgplbmRvYmoKeHJlZgowIDgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxNzYgMDAwMDAgbiAKMDAwMDAwMDIyNCAwMDAwMCBuIAowMDAwMDAwMjc5IDAwMDAwIG4gCjAwMDAwMDAzMjkgMDAwMDAgbiAKMDAwMDAwMDQyMiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCnRyYWlsZXIKPDwKL0lEWzwwNUY3MTFDRjlGRjFDRTRFQTUwNjIxMUNGNzhEQzRBRT48MDVGNzExQ0Y5RkYxQ0U0RUE1MDYyMTFDRjc4REM0QUU XQovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovU2l6ZSA4Cj4 + CnN0YXJ0eHJlZgo4MjgKJSVFT0YK \ "]

Die Daten zurückgegeben werden sollten eine Arraylist von Byte-Arrays werden, nachdem es deserialisiert wird. Doch die folgenden Fehler erzeugt wird stattdessen auf

Eine nicht behandelte Ausnahme des Typs ‚Newtonsoft.Json.JsonSerializationException‘ deserialize- versuchen, trat in Newtonsoft.Json.dll

Zusätzliche Informationen: Fehler beim Konvertieren Wert "[" JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA1MDUxMjQ0NTQtMDQnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCi9Qcm9kdWNlcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCj4 + CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4 + CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlL1BhZ2VzCi9Db3VudCAxCi9LaWRzWzcgMCBSXQo + PgplbmRvYmoK NCAwIG9iagpbCi9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSQpdCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHlwZTEKL0Jhc2VGb250L0hlbHZldGljYQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nCj4 + CmVuZG9iago2IDAgb2JqCjw8Ci9MZW5ndGggMTM4Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtClgJ4 + UqVDA30jMAEgomZhZAhpkJiCxKVQhXyOMFyhoZWOpZmimYGVromRopgJUYGekZG8GVOIUo6LsZKxgaKISkKRiAYVG6gompkZ65oYVCiA/EBJBeY0M9oECKgoZjmKOCpkJIlkKIloJrCClGGBnomZmAzXAO8g93cQ1CNiYQjPB7KBAAubYyZAplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwKL1BhcmVudCAzIDAgUgovVHlwZS9QYWdlCi9NZWRpYUJveFswIDAgNjEyIDc5Ml0KL1Jlc291cmNlcwo8PAovUHJvY1NldCA0IDAgUgovWE9iamVjdAo8PAo + PgovRm9udAo8PAovRjMgNSAwIFIKPj4KPj4KL0NvbnRlbnRzIDYgMCBSCi9Hcm91cAo8PAovQ1MvRGV2aWNlUkdCCi9TL1RyYW5zcGFyZW5jeQo + Pgo + PgplbmRvYmoKeHJlZgowIDgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxNzYgMDAwMDAgbiAKMDAwMDAwMDIyNCAwMDAwMCBuIAowMDAwMDAwMjc5IDAwMDAwIG4gCjAwMDAwMDAzMjkgMDAwMDAgbiAKMDAwMDAwMDQyMiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCnRyYWlsZXIKPDwKL0lEWzxDNjNFQUM2RDc2QTJEMjRB OTI3OEY0Q0ZDNTExQjI4RD48QzYzRUFDNkQ3NkEyRDI0QTkyNzhGNENGQzUxMUIyOEQ + XQovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovU2l6ZSA4Cj4 + CnN0YXJ0eHJlZgo4MjgKJSVFT0YK "]" eingeben 'System.Collections.ArrayList'. Weg '', Linie 1, Position 1524.

unten ist die Code- WEB 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 JOB-

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; 
    } 

EDIT BATCHPRINTBATCHINFO CODE-

  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

Fügen Sie den Code für die Klasse "BatchPrintBatchInfo" – Gusman

+0

@Gusman - BatchPrintBatchInfo hinzu. – Chris

+0

Ok, bist du sicher, dass es eine ArrayList von Bytearrays und keine ArrayList von Bytes ist? – Gusman

Antwort

1

Was Sie sehen, ist ein Array von Bytes, jede IEnumerable<byte> als Base64 serialisiert werden. aber als ArrayList ist nicht IEnumerable<byte> sondern IEnumerable dann weiß der Deserializer nicht, was mit den Base64-Daten zu tun, da der ArrayList Inhalt nicht definiert ist (es ist object). Wenn Sie es zu einem byte[] oder zu einem List<byte> deserialisieren, funktioniert es.

Per Beispiel:

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

Vermeiden Sie auch so viel wie möglich ArrayList, verwenden echte Arrays oder generische Sammlungen wie List<T>

EDIT: Sie wirklich eine Arraylist mit einem Byte haben [] nach innen, meine Schuld, dann der richtige Code Deserialisierung sollte sein:

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

Dies ist der vollständige Test arbeitet mit Ihren Daten:

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

Was Sie sehen, ein base64 ist kodierte Form Wenn Sie versuchen, es zu dekodieren, sehen Sie eine PDF-Datei.

Wahrscheinlich die BatchPrintBatchInfo Work Parameter enthält die Druckausgabe als PDF

+0

Ich habe versucht, Base64Decode-Methode und JSON-Zeichen vor der Decodierung entfernt. Ich habe Text bekommen, der teilweise lesbar war, und schien PDF zu sagen, wie du sagst. Möchte dies jedoch mit einer Methode arbeiten, die eine Array-Liste von Byte-Arrays zurückgibt. – Chris

+0

Liste der Byte-Arrays von was? – Max

+0

SSRS-Berichte wurden in Byte-Arrays umgewandelt, die in Form von PDFs auf ein NAS-Laufwerk geschrieben werden. – Chris

Verwandte Themen