Получение SerializeObject для использования имени JsonProperty, определенного внутри интерфейса

При вызове «JsonConvert.SerializeObject» я передаю объект, реализующий интерфейс. Это интерфейс, который определяет атрибуты JsonProperty для установки желаемого имени свойства объекта JSON. Однако, когда я проверяю созданный объект JSON, он использует фактическое имя свойства .NET, а не значение JsonPropertyAttribute. Это заставляет меня поверить, что это отражает только реализацию интерфейса для поиска атрибутов JsonProperty, а не сам интерфейс. Я убедился, что если я помещу атрибуты JsonProperty в реализующий класс, то все будет работать так, как ожидалось, но это нежелательное поведение. Есть ли способ заставить JSON.NET подобрать JsonPropertyAttributes, определенные для интерфейса, а также (или вместо) интерфейса.

public interface ISpecifyDataPageToGet
{
    [JsonProperty("offset")]
    int PageNumber { get; }

    [JsonProperty("limit")]
    int PageSize { get; }
}

public class PageInfo : ISpecifyDataPageToGet
{
    public PageInfo(int pageNumber, int pageSize)
    {
        this.PageNumber = pageNumber;
        this.PageSize = pageSize;
    }

    // I don't want to have to define JsonProperty attribute here
    public int PageNumber { get; private set; }

    // Or here
    public int PageSize { get; private set; }
}

public void MakeCall(ISpecifyDataPageToGet requestMessage)
{
    // I'm passing instance of interface in here, but it still only picks up
    // attributes defined on class implementing interface.
    JsonConvert.SerializeObject(requestMessage, Formatting.None, new JsonSerializerSettings());
    ...
    ...
}

ОБНОВЛЕНИЕ: сообщается на сайте проекта Codeplex.


person Paul Hadfield    schedule 08.05.2011    source источник
comment
Я столкнулся с таким же поведением, а именно: атрибуты JsonProperty в интерфейсе игнорируются для объекта, реализующего интерфейс. Было бы неплохо, если бы вышеописанное работало.   -  person Frank    schedule 09.05.2011
comment
Я предполагаю, что ни у кого уже нет исправления (простой выход). Если у меня будет шанс, я загружу исходный код и посмотрю, возможно ли это / что потребуется для его исправления / загрузки патча.   -  person Paul Hadfield    schedule 10.05.2011


Ответы (1)


Это было исправлено Джеймсом в кодовой базе Json.NET и работает. См. отчет о проблемах codeplex, а также Примечания к выпуску Json.NET 4.0 Release 3:

Новая функция — атрибуты JsonObject и JsonProperty теперь можно размещать в интерфейсе и использовать при сериализации реализующих объектов.

person Paul Hadfield    schedule 18.06.2011
comment
Ссылка не работает. Не могли бы вы снова предоставить рабочую ссылку? - person Sankar Balasubramanian; 27.03.2017