让SerializeObject使用界面内定义的JsonProperty“name”

时间:2011-05-08 18:22:05

标签: json.net

当调用“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 project site

报告

1 个答案:

答案 0 :(得分:3)

这已经在James的Json.NET代码库中得到修复,并且正在运行。 请参阅codeplex issue report以及Json.NET 4.0 Release 3 release notes

  

新功能 - JsonObject和JsonProperty属性现在可以放在接口上,并在序列化实现对象时使用。