RestSharp возвращает объект с нулевыми значениями - PullRequest
0 голосов
/ 21 октября 2019

Я использую 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."
 }
}

И вот объект в отладчике, показывающий нулевые значения свойств: Object with null values

Я потратил пару дней на это,Я уверен, что это работает для большинства людей, поэтому я, вероятно, просто упускаю что-то простое. Есть предложения?

Обновление: Чтобы доказать, что данные, поступающие с ответом, в порядке и соответствуют определению моего класса, я десериализовал содержимое ответа напрямую. Я создал новый класс-оболочку:

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 как-то не так? Есть предложения?

...