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 шт):

Автор решения: Kalmankantaja

Необходимо было добавить [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());
→ Ссылка
Автор решения: Alexander Petrov

Если сериализовать следующим образом:

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);
→ Ссылка