Управление версиями WebAPI C # - разные ответы для v1 и v2 через класс модели - PullRequest
0 голосов
/ 05 апреля 2019

В настоящее время у меня есть набор API и реализации v2 некоторых API. Уровень контроллера я сделал URL как / v2 /. У меня есть требование, когда один из ответов API -

Http Response

{
 "prd":"product name"
}

Product.cs

public class ProductInfo
{
  [JsonProperty("prd")]
  public string ProductName { get; set;}
}

В версии 2 API я хочу изменить JsonProperty ("prd") на JsonProperty ("product_name"). Как динамически изменить имя свойства и игнорировать определенное свойство в зависимости от версии API. Я не хочу дублировать сервисный слой

1 Ответ

0 голосов
/ 05 апреля 2019

Этого можно добиться с помощью пользовательского ContractResolver в Json.Net.Здесь я создал простой пример демонстрации.Вы можете выполнить его в зависимости от условий API-версии.

void Main()
{
    var productInfo = new ProductInfo();
    productInfo.ProductName = "Product Name";

    var jsonResolver = new PropertyRenameSerializerContractResolver();
    jsonResolver.RenameProperty(typeof(ProductInfo), "prd", "product_name");

    var serializerSettings = new JsonSerializerSettings();
    serializerSettings.ContractResolver = jsonResolver;

    var json = JsonConvert.SerializeObject(productInfo, serializerSettings);

    Console.WriteLine(json);
}

public class ProductInfo
{
    [JsonProperty("prd")]
    public string ProductName { get; set; }
}

public class PropertyRenameSerializerContractResolver : DefaultContractResolver
{
    private readonly Dictionary<Type, Dictionary<string, string>> _renames;

    public PropertyRenameSerializerContractResolver()
    {
        _renames = new Dictionary<Type, Dictionary<string, string>>();
    }

    public void RenameProperty(Type type, string propertyName, string newJsonPropertyName)
    {
        if (!_renames.ContainsKey(type))
            _renames[type] = new Dictionary<string, string>();

        _renames[type][propertyName] = newJsonPropertyName;
    }

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);

        if (IsRenamed(property.DeclaringType, property.PropertyName, out var newJsonPropertyName))
            property.PropertyName = newJsonPropertyName;

        return property;
    }

    private bool IsRenamed(Type type, string jsonPropertyName, out string newJsonPropertyName)
    {
        Dictionary<string, string> renames;

        if (!_renames.TryGetValue(type, out renames) || !renames.TryGetValue(jsonPropertyName, out newJsonPropertyName))
        {
            newJsonPropertyName = null;
            return false;
        }

        return true;
    }
}

Вывод этой программы будет выглядеть следующим образом:

{"product_name":"Product Name"}

Я использовал это в одном из сценариев, которые соответствуютс вашим сценарием.Для получения дополнительной информации вы можете обратиться к следующей статье.

Advanced Newtonsoft.Json: Динамическое переименование или игнорирование свойств без изменения сериализованного класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...