要使用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进行交互,它适用于所有标准字段。不幸的是,自定义字段是事物绊倒的地方。自定义字段没有确定字段名称,而是为其分配了编号。所以如果我有一个"分辨率类型"自定义字段,该属性不会被称为" ResolutionType",而是" customfield_10200"。
我处理具有相同自定义字段的多个部署,但它们都具有不同的字段ID。我喜欢做的事情是这样的:
[JsonProperty(ConfigurationManager.AppSettings["JiraResolutionTypeId"])]
public string ResolutionType{ get; set; }
但是你只能在这样的属性中使用编译时常量,所以我不能以这种方式动态设置id。
我怎样才能解决这个问题?
答案 0 :(得分:3)
使用custom contract resolver可以让您轻松完成此操作。添加自己的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"
答案 1 :(得分:0)
此处记录了另一种方法。 http://www.31a2ba2a-b718-11dc-8314-0800200c9a66.com/2016/01/a-simple-approach-to-getting-all-of.html
获取Json请求,转换为XML,保存在SQL Server中,然后使用自定义函数从自定义JIRA字段中提取所需内容。