3

json.net を使用してオブジェクトを json にシリアル化するには、json プロパティごとにラベル付けされた属性を持つ POCO を作成する必要があります。

public class Priority
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("iconUrl")]
    public string IconUrl { get; set; }
}

これを使用して Jira の REST API を操作していますが、すべての標準フィールドでうまく機能します。残念ながら、カスタム フィールドは問題が発生する場所です。カスタム フィールドにはフィールド名が決まっておらず、代わりに番号が割り当てられています。したがって、「Resolution Type」カスタム フィールドがある場合、プロパティは「ResolutionType」ではなく「customfield_10200」と呼ばれます。

同じカスタム フィールドを持つ複数の展開を扱っていますが、それらはすべて異なるフィールド ID を持っています。私がやりたいことは次のようなものです:

[JsonProperty(ConfigurationManager.AppSettings["JiraResolutionTypeId"])]
public string ResolutionType{ get; set; }

しかし、そのような属性にはコンパイル時の定数しか持てないので、そのように動的に id を設定することはできません。

どうすればこれを回避できますか?

4

2 に答える 2

3

カスタム コントラクト リゾルバーを使用すると、これを非常に簡単に行うことができます。独自のクラスを追加するAttributeと、一般的な方法でそれを行うことができます。

// add attribute so this only targets properties, or whatever you want
public class JiraAttribute : Attribute
{
    public string LookupId { get; private set; }
    public JiraAttribute(string lookupId)
    {
        this.LookupId = lookupId;
    }
}
public class JiraContractResolver : DefaultContractResolver
{
    public static readonly JiraContractResolver Instance = new JiraContractResolver();

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

        var attr = member.GetCustomAttributes(typeof(JiraAttribute), true).Cast<JiraAttribute>().ToList();
        if (attr != null && attr.Count > 0)
        {
            property.PropertyName = ConfigurationManager.AppSettings[attr[0].LookupId];
        }

        return property;
    }
}

// in a class
[Jira("JiraResolutionTypeId")]
public string ResolutionType { get; set; }

//e.g.
// ConfigurationManager.AppSettings["JiraResolutionTypeId"] == "customfield_10200"
var settings = new JsonSerializerSettings { ContractResolver = JiraContractResolver.Instance };
var s = JsonConvert.SerializeObject(new Priority { Id = "123", ResolutionType = "abc" }, settings);
// {"id":"123","name":null,"iconUrl":null,"customfield_10200":"abc"}
var d = JsonConvert.DeserializeObject<Priority>(s, settings);
// d.ResolutionType == "abc"
于 2014-04-17T20:51:42.617 に答える