使用 Newtonsoft 进行反序列化 Json 无效
De-Serializing Json with Newtonsoft Not Working
我正在编写一个控制台应用程序,它使用 Web API (web api 2) 来获取数据。控制台应用程序将一个复杂的对象传递到网络 api(目前没有问题)。我正在使用 Newtonsoft json 到 serialize/deserialize 数据。问题是,当我在控制台应用程序中反序列化 return 数据时,它又无法使用了。下面是数据 returned-
[\"JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA1MDUxMjM2MzYtMDQnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCi9Qcm9kdWNlcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlL1BhZ2VzCi9Db3VudCAxCi9LaWRzWzcgMCBSXQo+PgplbmRvYmoKNCAwIG9iagpbCi9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSQpdCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHlwZTEKL0Jhc2VGb250L0hlbHZldGljYQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago2IDAgb2JqCjw8Ci9MZW5ndGggMTM4Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtClgJ4+UqVDA30jMAEgomZhZAhpkJiCxKVQhXyOMFyhoZWOpZmimYGVromRopgJUYGekZG8GVOIUo6LsZKxgaKISkKRiAYVG6gompkZ65oYVCiA/EBJBeY0M9oECKgoZjmKOCpkJIlkKIloJrCClGGBnomZmAzXAO8g93cQ1CNiYQjPB7KBAAubYyZAplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwKL1BhcmVudCAzIDAgUgovVHlwZS9QYWdlCi9NZWRpYUJveFswIDAgNjEyIDc5Ml0KL1Jlc291cmNlcwo8PAovUHJvY1NldCA0IDAgUgovWE9iamVjdAo8PAo+PgovRm9udAo8PAovRjMgNSAwIFIKPj4KPj4KL0NvbnRlbnRzIDYgMCBSCi9Hcm91cAo8PAovQ1MvRGV2aWNlUkdCCi9TL1RyYW5zcGFyZW5jeQo+Pgo+PgplbmRvYmoKeHJlZgowIDgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxNzYgMDAwMDAgbiAKMDAwMDAwMDIyNCAwMDAwMCBuIAowMDAwMDAwMjc5IDAwMDAwIG4gCjAwMDAwMDAzMjkgMDAwMDAgbiAKMDAwMDAwMDQyMiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCnRyYWlsZXIKPDwKL0lEWzwwNUY3MTFDRjlGRjFDRTRFQTUwNjIxMUNGNzhEQzRBRT48MDVGNzExQ0Y5RkYxQ0U0RUE1MDYyMTFDRjc4REM0QUU+XQovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovU2l6ZSA4Cj4+CnN0YXJ0eHJlZgo4MjgKJSVFT0YK\"]
正在return编辑的数据在反序列化后应该是字节数组的数组列表。但是,在尝试反序列化时会生成以下错误 -
An unhandled exception of type
'Newtonsoft.Json.JsonSerializationException' occurred in
Newtonsoft.Json.dll
Additional information: Error converting value
"["JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA1MDUxMjQ0NTQtMDQnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCi9Qcm9kdWNlcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlL1BhZ2VzCi9Db3VudCAxCi9LaWRzWzcgMCBSXQo+PgplbmRvYmoKNCAwIG9iagpbCi9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSQpdCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHlwZTEKL0Jhc2VGb250L0hlbHZldGljYQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago2IDAgb2JqCjw8Ci9MZW5ndGggMTM4Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtClgJ4+UqVDA30jMAEgomZhZAhpkJiCxKVQhXyOMFyhoZWOpZmimYGVromRopgJUYGekZG8GVOIUo6LsZKxgaKISkKRiAYVG6gompkZ65oYVCiA/EBJBeY0M9oECKgoZjmKOCpkJIlkKIloJrCClGGBnomZmAzXAO8g93cQ1CNiYQjPB7KBAAubYyZAplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwKL1BhcmVudCAzIDAgUgovVHlwZS9QYWdlCi9NZWRpYUJveFswIDAgNjEyIDc5Ml0KL1Jlc291cmNlcwo8PAovUHJvY1NldCA0IDAgUgovWE9iamVjdAo8PAo+PgovRm9udAo8PAovRjMgNSAwIFIKPj4KPj4KL0NvbnRlbnRzIDYgMCBSCi9Hcm91cAo8PAovQ1MvRGV2aWNlUkdCCi9TL1RyYW5zcGFyZW5jeQo+Pgo+PgplbmRvYmoKeHJlZgowIDgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxNzYgMDAwMDAgbiAKMDAwMDAwMDIyNCAwMDAwMCBuIAowMDAwMDAwMjc5IDAwMDAwIG4gCjAwMDAwMDAzMjkgMDAwMDAgbiAKMDAwMDAwMDQyMiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCnRyYWlsZXIKPDwKL0lEWzxDNjNFQUM2RDc2QTJEMjRBOTI3OEY0Q0ZDNTExQjI4RD48QzYzRUFDNkQ3NkEyRDI0QTkyNzhGNENGQzUxMUIyOEQ+XQovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovU2l6ZSA4Cj4+CnN0YXJ0eHJlZgo4MjgKJSVFT0YK"]"
to type 'System.Collections.ArrayList'. Path '', line 1, position
1524.
下面是代码-
网页 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;
}
}
网络作业-
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 代码-
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
}
您看到的是 base64 编码格式,如果您尝试对其进行解码,您会看到一个 PDF 文件。
很可能 BatchPrintBatchInfo Work
参数包含 PDF 格式的打印输出
您看到的是一个字节数组,任何 IEnumerable<byte>
都将被序列化为 Base64。但由于 ArrayList
不是 IEnumerable<byte>
而是 IEnumerable
那么反序列化器不知道如何处理 Base64 数据,因为 ArrayList
内容未定义(它是 object
).如果您将它反序列化为 byte[]
或 List<byte>
它将起作用。
例如:
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);
我正在编写一个控制台应用程序,它使用 Web API (web api 2) 来获取数据。控制台应用程序将一个复杂的对象传递到网络 api(目前没有问题)。我正在使用 Newtonsoft json 到 serialize/deserialize 数据。问题是,当我在控制台应用程序中反序列化 return 数据时,它又无法使用了。下面是数据 returned-
[\"JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA1MDUxMjM2MzYtMDQnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCi9Qcm9kdWNlcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlL1BhZ2VzCi9Db3VudCAxCi9LaWRzWzcgMCBSXQo+PgplbmRvYmoKNCAwIG9iagpbCi9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSQpdCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHlwZTEKL0Jhc2VGb250L0hlbHZldGljYQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago2IDAgb2JqCjw8Ci9MZW5ndGggMTM4Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtClgJ4+UqVDA30jMAEgomZhZAhpkJiCxKVQhXyOMFyhoZWOpZmimYGVromRopgJUYGekZG8GVOIUo6LsZKxgaKISkKRiAYVG6gompkZ65oYVCiA/EBJBeY0M9oECKgoZjmKOCpkJIlkKIloJrCClGGBnomZmAzXAO8g93cQ1CNiYQjPB7KBAAubYyZAplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwKL1BhcmVudCAzIDAgUgovVHlwZS9QYWdlCi9NZWRpYUJveFswIDAgNjEyIDc5Ml0KL1Jlc291cmNlcwo8PAovUHJvY1NldCA0IDAgUgovWE9iamVjdAo8PAo+PgovRm9udAo8PAovRjMgNSAwIFIKPj4KPj4KL0NvbnRlbnRzIDYgMCBSCi9Hcm91cAo8PAovQ1MvRGV2aWNlUkdCCi9TL1RyYW5zcGFyZW5jeQo+Pgo+PgplbmRvYmoKeHJlZgowIDgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxNzYgMDAwMDAgbiAKMDAwMDAwMDIyNCAwMDAwMCBuIAowMDAwMDAwMjc5IDAwMDAwIG4gCjAwMDAwMDAzMjkgMDAwMDAgbiAKMDAwMDAwMDQyMiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCnRyYWlsZXIKPDwKL0lEWzwwNUY3MTFDRjlGRjFDRTRFQTUwNjIxMUNGNzhEQzRBRT48MDVGNzExQ0Y5RkYxQ0U0RUE1MDYyMTFDRjc4REM0QUU+XQovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovU2l6ZSA4Cj4+CnN0YXJ0eHJlZgo4MjgKJSVFT0YK\"]
正在return编辑的数据在反序列化后应该是字节数组的数组列表。但是,在尝试反序列化时会生成以下错误 -
An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll
Additional information: Error converting value "["JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA1MDUxMjQ0NTQtMDQnMDAnKQovQ3JlYXRvcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCi9Qcm9kdWNlcihQREZzaGFycCAxLjUwLjQwMDAgXCh3d3cucGRmc2hhcnAuY29tXCkpCj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlL1BhZ2VzCi9Db3VudCAxCi9LaWRzWzcgMCBSXQo+PgplbmRvYmoKNCAwIG9iagpbCi9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSQpdCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHlwZTEKL0Jhc2VGb250L0hlbHZldGljYQovRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago2IDAgb2JqCjw8Ci9MZW5ndGggMTM4Ci9GaWx0ZXIvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtClgJ4+UqVDA30jMAEgomZhZAhpkJiCxKVQhXyOMFyhoZWOpZmimYGVromRopgJUYGekZG8GVOIUo6LsZKxgaKISkKRiAYVG6gompkZ65oYVCiA/EBJBeY0M9oECKgoZjmKOCpkJIlkKIloJrCClGGBnomZmAzXAO8g93cQ1CNiYQjPB7KBAAubYyZAplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwKL1BhcmVudCAzIDAgUgovVHlwZS9QYWdlCi9NZWRpYUJveFswIDAgNjEyIDc5Ml0KL1Jlc291cmNlcwo8PAovUHJvY1NldCA0IDAgUgovWE9iamVjdAo8PAo+PgovRm9udAo8PAovRjMgNSAwIFIKPj4KPj4KL0NvbnRlbnRzIDYgMCBSCi9Hcm91cAo8PAovQ1MvRGV2aWNlUkdCCi9TL1RyYW5zcGFyZW5jeQo+Pgo+PgplbmRvYmoKeHJlZgowIDgKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAxNzYgMDAwMDAgbiAKMDAwMDAwMDIyNCAwMDAwMCBuIAowMDAwMDAwMjc5IDAwMDAwIG4gCjAwMDAwMDAzMjkgMDAwMDAgbiAKMDAwMDAwMDQyMiAwMDAwMCBuIAowMDAwMDAwNjMxIDAwMDAwIG4gCnRyYWlsZXIKPDwKL0lEWzxDNjNFQUM2RDc2QTJEMjRBOTI3OEY0Q0ZDNTExQjI4RD48QzYzRUFDNkQ3NkEyRDI0QTkyNzhGNENGQzUxMUIyOEQ+XQovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovU2l6ZSA4Cj4+CnN0YXJ0eHJlZgo4MjgKJSVFT0YK"]" to type 'System.Collections.ArrayList'. Path '', line 1, position 1524.
下面是代码- 网页 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;
}
}
网络作业-
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 代码-
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
}
您看到的是 base64 编码格式,如果您尝试对其进行解码,您会看到一个 PDF 文件。
很可能 BatchPrintBatchInfo Work
参数包含 PDF 格式的打印输出
您看到的是一个字节数组,任何 IEnumerable<byte>
都将被序列化为 Base64。但由于 ArrayList
不是 IEnumerable<byte>
而是 IEnumerable
那么反序列化器不知道如何处理 Base64 数据,因为 ArrayList
内容未定义(它是 object
).如果您将它反序列化为 byte[]
或 List<byte>
它将起作用。
例如:
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);