Newtonsoft.Json конвертация из string в enum по имени
Есть следующий класс и enum:
public class Payment
{
[JsonProperty("payment_type")]
public PaymentType PaymentType { get; set; }
}
public enum PaymentType
{
Success,
WaitingForCapture,
Canceled
}
Я получаю следующий json:
{
"payment_type": "waiting_for_capture"
}
При попытке распарсить получаю ошибку: Error converting value "waiting_for_capture" to type PaymentType. Requested value 'waiting_for_capture' was not found
Я пытался исправить это добавлением атрибута [JsonProperty("waiting_for_capture")] над значением в enum, но это не помогло. Так же пытался в JsonConverter.DeserializeObject(json, new StringEnumConverter()), но это так же не помогло. Как решить проблему? Желательно без создания новых классов
Ответы (2 шт):
Необходимо было добавить [EnumMember(Value = "waiting_for_capture)] для того, чтобы StringEnumConverter мог десериализовать строку в нужный мне enum:
public enum PaymentType
{
Success,
[EnumMember(Value = "waiting_for_capture")]
WaitingForCapture,
Canceled
}
var result = JsonConverter.DeserializeObject(json, new StringEnumConverter());
Если сериализовать следующим образом:
var json = JsonConvert.SerializeObject(payment, new StringEnumConverter());
То результат будет:
{"payment_type":"WaitingForCapture"}
Соответственно, десериализация работает без проблем.
Полный код для примера:
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
var payment = new Payment { PaymentType = PaymentType.WaitingForCapture };
var json = JsonConvert.SerializeObject(payment, new StringEnumConverter());
Console.WriteLine(json);
var result = JsonConvert.DeserializeObject<Payment>(json);
Console.WriteLine(result.PaymentType);