次のように、いくつかのオブジェクトにカスタム プロパティを追加しました。
[JsonCustomRoot("status")]
public class StatusDTO
{
public int StatusId { get; set; }
public string Name { get; set; }
public DateTime Created { get; set; }
}
属性は非常に単純です。
public class JsonCustomRoot :Attribute
{
public string rootName { get; set; }
public JsonCustomRoot(string rootName)
{
this.rootName = rootName;
}
}
オブジェクトのインスタンスをシリアル化するときの JSON.NET からの既定の出力は次のとおりです。
{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}
問題は次のとおりです。次のように、カスタム属性の値を使用して JSON にルートノードを追加するにはどうすればよいですか。
{status:{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}}
IContractResolverインターフェイスについて言及している記事をいくつか見つけましたが、その方法を理解できません。私の試みには、この未完成のコードが含まれています。
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
var info = objectType.GetCustomAttributes()
.SingleOrDefault(t => (Type)t.TypeId==typeof(JsonCustomRoot));
if (info != null)
{
var myAttribute = (JsonCustomRoot)info;
// How can i add myAttribute.rootName to the root from here?
// Maybe some other method should be overrided instead?
}
return contract;
}