Я использую RestSharp 106.6.10. Я ожидаю, что ответ вернет простой объект с четырьмя строковыми свойствами. Я определил класс объекта в C # с правильными типами свойств, написанием и прописными буквами.
Я отправляю запрос и получаю ответ без ошибок. Содержимое ответа выглядит как чистый JSON с объектом Data, который содержит хорошие значения для моего объекта "TransactionAcknowledgement". Но вот моя проблема: объект Data, возвращаемый RestSharp, имеет нулевые значения для десериализованных свойств.
Я пробовал несколько предложений от SO и других сайтов: Добавление подсказок "DeserializeAs" на свойства класса;использование OnBeforeDeserialization для установки ContentType = "application / json";и несколько других идей, предложенных другими. Кажется, ничего не помогает.
Вот определение класса:
public class TransactionAcknowledgement
{
[DeserializeAs(Name = "BusinessEntityID")] // These hints don't seem to help.
public string BusinessEntityID { get; set; }
[DeserializeAs(Name = "BusinessEntityMedicaidIdentifier")]
public string BusinessEntityMedicaidIdentifier { get; set; }/
[DeserializeAs(Name = "TransactionID")]
public string TransactionID { get; set; }
[DeserializeAs(Name = "Reason")]
public string Reason { get; set; }
}
И фрагмент кода C #:
RestClient restClient;
RestRequest restRequest;
IRestResponse<TransactionAcknowledgement> restResponse;
restClient = new RestClient(MyBaseUrl);
restClient.Authenticator = new HttpBasicAuthenticator(evvCompanyAggregator.EffectiveUserID, evvCompanyAggregator.EffectiveUserPassword);
restRequest = new RestRequest("MyResource", Method.POST, DataFormat.Json);
restRequest.AddJsonBody(myData);
restRequest.OnBeforeDeserialization = r => { r.ContentType = "application/json"; }; // This doesn't seem to help.
restResponse = restClient.Execute<TransactionAcknowledgement>(restRequest);
RestResponse.Content выглядит хорошо, в том числе хорошозначения в объекте «Данные» в строке raw restResponse.Content. Объект restResponse.Content.Data также является правильным классом, TransactionAcknowledgement
. Однако все значения свойств в restResponse.Content.Data имеют нулевое значение.
Вот необработанная строка restResponse.Content:
"{\n \"id\": \"1de51d1a-8086-4ba7-8aa6-2d1431986a99\",\n \"status\": null,\n \"token\": null,\n \"messageSummary\": \"Transaction Received.\",\n \"messageDetail\": null,\n \"errorMessage\": null,\n \"failedCount\": 0,\n \"succeededCount\": 0,\n \"cached\": false,\n \"cachedDate\": null,\n \"totalRows\": 0,\n \"page\": 0,\n \"pageSize\": 0,\n \"orderByColumn\": null,\n \"orderByDirection\": null,\n \"data\": {\n \"BusinessEntityID\": \"200248\",\n \"BusinessEntityMedicaidIdentifier\": \"8471209\",\n \"TransactionID\": \"1de51d1a-8086-4ba7-8aa6-2d1431986a99\",\n \"Reason\": \"Transaction Received.\"\n }\n}"
А здесь тот же restResponse.Content, приятно отформатированный дляудобочитаемость:
{
"id": "bf0606a3-f21d-4d51-980c-bee407adc561",
"status": null,
"token": null,
"messageSummary": "Transaction Received.",
"messageDetail": null,
"errorMessage": null,
"failedCount": 0,
"succeededCount": 0,
"cached": false,
"cachedDate": null,
"totalRows": 0,
"page": 0,
"pageSize": 0,
"orderByColumn": null,
"orderByDirection": null,
"data": {
"BusinessEntityID": "200248",
"BusinessEntityMedicaidIdentifier": "8471209",
"TransactionID": "bf0606a3-f21d-4d51-980c-bee407adc561",
"Reason": "Transaction Received."
}
}
И вот объект в отладчике, показывающий нулевые значения свойств:
Я потратил пару дней на это,Я уверен, что это работает для большинства людей, поэтому я, вероятно, просто упускаю что-то простое. Есть предложения?
Обновление: Чтобы доказать, что данные, поступающие с ответом, в порядке и соответствуют определению моего класса, я десериализовал содержимое ответа напрямую. Я создал новый класс-оболочку:
public class HttpRestRootObject
{
public TransactionAcknowledgement data { get; set; }
}
Затем я десериализовал строку restResponse.Content без RestSharp:
HttpRestRootObject testRoot = javaScriptSerializer.Deserialize<HttpRestRootObject>(restResponse.Content);
TransactionAcknowledgement transactionAcknowledgement = testRoot.data;
Итак, все работает , за исключением RestSharp'sдесериализации. Я использую RestSharp как-то не так? Есть предложения?